首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在不损失精度的情况下将浮点数转换为双精度

在不损失精度的情况下将浮点数转换为双精度
EN

Stack Overflow用户
提问于 2009-05-27 14:39:16
回答 7查看 261.3K关注 0票数 114

我有一个基本的浮点数,我需要一个原始的双精度数。简单地将浮点数转换为double会给我带来奇怪的额外精度。例如:

代码语言:javascript
复制
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375

但是,如果不是强制转换,而是将浮点型作为字符串输出,并将字符串解析为双精度型,那么我就得到了我想要的:

代码语言:javascript
复制
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35

有没有比使用字符串来回转换更好的方法呢?

EN

回答 7

Stack Overflow用户

发布于 2012-02-07 16:45:45

我发现转换成二进制表示更容易理解这个问题。

代码语言:javascript
复制
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更准确,这就是问题所在。

代码语言:javascript
复制
   111110100010100011110101110001
11111111010001010001111010111000100000000000000000000000000000
11111111010001010001111010111000010100011110101110000101001000
票数 46
EN

Stack Overflow用户

发布于 2013-01-02 20:24:56

我今天遇到了这个问题,不能使用BigDecimal的重构,因为这个项目真的很大。然而,我找到了解决方案:

代码语言:javascript
复制
Float result = new Float(5623.23)
Double doubleResult = new FloatingDecimal(result.floatValue()).doubleValue()

这是可行的。

注意,调用result.doubleValue()返回5623.22998046875

但是调用doubleResult.doubleValue()会正确返回5623.23

但我不能完全确定这是不是一个正确的解决方案。

票数 16
EN

Stack Overflow用户

发布于 2009-05-27 14:45:29

使用BigDecimal而不是float/double。有很多数字不能用二进制浮点数表示(例如,0.1)。因此,您必须始终将结果舍入到已知的精度,或者使用BigDecimal

有关详细信息,请参阅http://en.wikipedia.org/wiki/Floating_point

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/916081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档