我有一个基本的浮点数,我需要一个原始的双精度数。简单地将浮点数转换为double会给我带来奇怪的额外精度。例如:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
但是,如果不是强制转换,而是将浮点型作为字符串输出,并将字符串解析为双精度型,那么我就得到了我想要的:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
有没有比使用字符串来回转换更好的方法呢?
发布于 2012-02-07 16:45:45
我发现转换成二进制表示更容易理解这个问题。
float f = 0.27f;
double d2 = (double) f;
double d3 = 0.27d;
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(f)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d2)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d3)));
你可以看到,通过在末尾添加0,浮点数被扩展到了双精度,但是双精度表示0.27更准确,这就是问题所在。
111110100010100011110101110001
11111111010001010001111010111000100000000000000000000000000000
11111111010001010001111010111000010100011110101110000101001000
发布于 2013-01-02 20:24:56
我今天遇到了这个问题,不能使用BigDecimal的重构,因为这个项目真的很大。然而,我找到了解决方案:
Float result = new Float(5623.23)
Double doubleResult = new FloatingDecimal(result.floatValue()).doubleValue()
这是可行的。
注意,调用result.doubleValue()返回5623.22998046875
但是调用doubleResult.doubleValue()会正确返回5623.23
但我不能完全确定这是不是一个正确的解决方案。
发布于 2009-05-27 14:45:29
使用BigDecimal
而不是float
/double
。有很多数字不能用二进制浮点数表示(例如,0.1
)。因此,您必须始终将结果舍入到已知的精度,或者使用BigDecimal
。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Floating_point。
https://stackoverflow.com/questions/916081
复制相似问题