首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java双精度:不同的公式导致不同的结果

Java双精度:不同的公式导致不同的结果
EN

Stack Overflow用户
提问于 2016-11-04 13:26:43
回答 1查看 204关注 0票数 2

今天,我发现一个有趣的事实,即公式将影响结果的精度。请看下面的代码

代码语言:javascript
复制
double x = 7d
double y = 10d
​println(1-x/y​)
println((y-x)/y​)​

我使用groovy编写了这段代码,您只需将其视为Java

结果是

代码语言:javascript
复制
1-x/y: 0.30000000000000004
(y-x)/y: 0.3

有趣的是,两个应该相等的公式有不同的结果。

  • 有人能给我解释一下吗?
  • 我能否将第二个公式应用于任何适用的地方,作为双精度问题的有效解决方案?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-04 13:45:06

为了控制浮点算法的精度,应该使用java.math.BigDecimal。你可以做这样的事。

代码语言:javascript
复制
BigDecimal xBigdecimal = BigDecimal.valueOf(7d);
BigDecimal yBigdecimal = BigDecimal.valueOf(10d);
System.out.println(BigDecimal.valueOf(1).subtract(xBigdecimal.divide(yBigdecimal)));

有人能给我解释一下吗?

Java中的浮点数和双原语类型是浮点数,其中数字以分数和指数的二进制表示形式存储。

更具体地说,双精度浮点值(如double type )是64位值,其中:

1位表示符号(正或负)。指数为11位。用于有效数字的52位(小数部分作为二进制)。将这些部分组合在一起产生一个值的双重表示。

检查

有关如何在Java中处理浮点值的详细说明,请遵循Java语言规范的浮点类型、格式和值。

字节、字符、int、长类型是不动点数,它们是数字的精确表示.与不动点数字不同的是,浮点数有时(在大多数情况下可以安全地假定)无法返回一个数字的准确表示。这就是为什么在1- (x / y​)的结果中得到0.30000000000000004的原因。

当需要精确的值(如1.5或150.1005 )时,您将需要使用一种不动点类型,它将能够准确地表示数字。

正如我在上面的示例中所展示的那样,Java有一个BigDecimal类,它将处理非常大的数字和非常小的数字。

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

https://stackoverflow.com/questions/40423871

复制
相关文章

相似问题

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