首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java中双精度类型的求和问题

java中双精度类型的求和问题
EN

Stack Overflow用户
提问于 2013-06-17 15:21:25
回答 5查看 1.2K关注 0票数 1

我有一句简单的sop语句:

代码语言:javascript
运行
复制
 System.out.println(0.0000877979+0.3067846127);

上面一行的输出是:0.30687241060000003

但是期望的是:0.3068724106

我怀疑,为什么最终会有额外的0000003出现。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-17 15:25:46

您需要理解什么是double数:它是一个二进制浮点数。因此,它不能精确地表示所有的十进制数。例如,以数字0.2为例。没有有限的二进制表示-就像没有有限的十进制表示1/3一样。

如果你对十进制数字感兴趣,那么你应该使用BigDecimal。然而,这实际上可能并不适合您正在尝试实现的目标。在您的案例中,这些数字意味着什么?它们是来自自然属性(体重,身高等)的测量值,还是“人工”的,自然的十进制值,如财务数据?这会影响您应该使用的类型。

BigDecimaldouble在三个重要方面不同:

  • ,它支持任意精度(基本上和你的内存一样多的数字),它有一个浮点小数点,而不是一个浮点二进制点。因此,虽然它仍然不能准确地表示“第三个”,但它可以精确地表示十进制值。
  • 它是一个类类型,而不是一个原语。就可以表示的数字而言,这并不重要,但重要的是要理解这两种类型之间的差异。

在构造BigDecimal时,重要的是从准确的值开始-将double转换为BigDecimal几乎总是错误的。因此,如果您将用户输入作为文本,这是很好的:

代码语言:javascript
运行
复制
BigDecimal bd1 = new BigDecimal("0.0000877979");
BigDecimal bd2 = new BigDecimal("0.3067846127");
System.out.println(bd1.add(bd2)); // Prints 0.3068724106

在其他情况下,您可以从另一个BigDecimal开始,也可以从一个整数开始。

票数 7
EN

Stack Overflow用户

发布于 2013-06-17 15:22:56

这是因为在二进制环境中使用浮点算法。有关更多信息,请查看此IEEE 754标准。

你应该使用BigDecimal类来指定。

使用BigDecimal.valueOf(value)double转换为BigDecimal

使用Double.toString( BigDecimal )方法提供的double的规范字符串表示将double转换为double。

票数 4
EN

Stack Overflow用户

发布于 2013-06-17 15:23:23

这是正常的,因为浮点数(Java语言中的floatdouble )的性质是有限的。请了解浮点算术(IEEE 754)。

要获得准确的数字,请在Java语言中使用BigDecimal

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

https://stackoverflow.com/questions/17142280

复制
相关文章

相似问题

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