今天,我发现一个有趣的事实,即公式将影响结果的精度。请看下面的代码
double x = 7d
double y = 10d
println(1-x/y)
println((y-x)/y)我使用groovy编写了这段代码,您只需将其视为Java
结果是
1-x/y: 0.30000000000000004
(y-x)/y: 0.3有趣的是,两个应该相等的公式有不同的结果。
发布于 2016-11-04 13:45:06
为了控制浮点算法的精度,应该使用java.math.BigDecimal。你可以做这样的事。
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类,它将处理非常大的数字和非常小的数字。
https://stackoverflow.com/questions/40423871
复制相似问题