两个负数相乘是正数吗

来说确实愧疚,用spark解决hive表格中的数据信息时,出現了2个正数乘积最终数据显示为负数后我的第一反应居然有点儿懵圈,充分证明了自身在应用数据信息时,对Hive表格中的字段种类沒有开展充足的掌握,那时候,第二反映才想到是基本数据类型造成的数据信息超出了,这一还得归结为在那时候建立Hive表的情况下,沒有充足对表中每一个字段要储存的基本数据类型开展充足调研
归类基本数据类型字节数取值范围初始值布尔运算boolean1false,truefalse整数金额字节数型byte1-128~127,即-2^7 ~ -2^7-10整数金额短整形short2-32768~32767,即-2^15 ~ -2^15-10整数金额整形int4-2147483648~2147483647,即-2^31 ~ -2^31-10整数金额长整型long8-9 223 372 036 854 775 808~9 223 372 036 854 775 807,即-2^63 ~ -2^63-10标识符char20~65535,\\u0000 ~ ?\\u0000浮点数单精度浮点数float4负数范畴:-3.4028234663852886 × 10^38 ~ -1.40129846432481707 × 10^-45,正数范畴:1.40129846432481707 × 10^-45~3.4028234663852886 × 10^380.0f浮点数双精度浮点数float8负数范畴:-1.7976931348623157 × 10^308 ~ -4.94065645841246544 × 10^-324,正数范畴:4.94065645841246544 × 10^1.7976931348623157 × 10^3080.0
Hive表一个字段的种类


两个负数相乘是正数吗

文章插图
我的实际操作
出現的难题
根据抽样检查total_flow = 113716790,乘于25后为3411503700,avg_tf = 2个负数乘积是正数吗322183360,一切正常結果约为38,可实际結果约为-1.75…
根本原因
int较大 赋值为2147438647,而如今早已做到3411503700,显而易见远远地超出了int的取值范围,因而出現那样的缘故
解决方法
(1)改动字段的种类为Double
(2)在预估的情况下,将字段的计算成数量级小一下的,避免 超出,例如我这里给分子分母另外除于1000,或是先除后乘
这儿做一个简单检测:int最高值 1的結果?
結果:
为何超出int较大 范畴結果变成负数?
【两个负数相乘是正数吗】这一和电子计算机怎样储存二进制相关,在电脑上里是以补码出現的 。第一位是标记位 。0为正,1为负,当正的除开标记位全为1时候,如果再加一就进位了,造成标记位为1,别的为0,再换为102个负数乘积是正数吗 进制便是你这一数了