我正在尝试将浮点值转换为32位无符号长值,并面临价值损失的问题。
long v = (long) f;
这里f
是4294967295((2 ^ 32)-1)。由于将float转换精确到小数点后7位,所以将long转换为4294967296而不是4294967295。我需要精确到9位小数。有什么办法可以做到这一点?
答案 0 :(得分:2)
Java Puzzlers中的语录:陷阱,陷阱和案例案例
浮点运算返回最接近其浮点值的浮点值 精确的数学结果。一旦相邻浮点值之间的距离 大于2,将1加到浮点值将无效, 因为不会达到两个值之间的中点。对于浮点类型, 加1无效的最小幅度为2 ^ 25,或者 33,554,432;对于double类型,它是2 ^ 54,或大约1.8×10 ^ 16。
因此,从根本上讲,如果要表示大数,float
是个坏主意。高于2 ^ 25时,它至少不能表示所有其他整数。数字越大,情况越糟。
您最好的选择是改用BigDecimal
。