请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
当我开始使用相等运算符比较两个浮点值时,我使用的代码审查工具会引用以下内容.什么是正确的方法以及如何做到这一点?是否有一个帮助函数(commons-*),我可以重用它?
描述
无法使用equals(==)运算符比较浮点值
说明
通过使用等式(==)或不等式(!=)运算符来比较浮点值并不总是准确的,因为舍入错误.
建议
比较两个浮点值以查看它们是否接近值.
float a;
float b;
if(a==b)
{
..
}
Run Code Online (Sandbox Code Playgroud) 我在java中编写了一个关于浮点的程序,但得到的输出并不准确; 而用C编写的相同程序确实产生了准确的结果.
代码片段:
public class One {
public static void main(String...args){
double i, num=0.0;
for(i=0;i<10;i++)
num=num+0.1;
System.out.println(num);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:0.9999999999999999
C中的程序是这样的
#include<stdio.h>
main()
{
double i,num=0.0;
for(i=0;i<10;i++)
num=num+0.1;
printf("%f",num);
}
Run Code Online (Sandbox Code Playgroud)
输出:1.00000
我究竟做错了什么?
我知道这个问题已经多次讨论过,但我对答案并不完全满意.请不要回答"双打不准确,你不能代表0.1!你必须使用BigDecimal"......
基本上我正在做一个财务软件,我们需要在内存中存储很多价格.BigDecimal太大了,无法容纳缓存,因此我们决定切换到double.到目前为止,我们没有因为正当理由而遇到任何错误,我们需要12位数的准确度.12位数的估计基于这样一个事实:即使我们以百万谈话,我们仍然能够处理美分.
double给出15位有效十进制数字精度.如果你在显示/比较它们时绕过你的双打,会出现什么问题?
我猜问题是不准确的积累,但有多糟糕呢?在它影响第12位之前需要多少次操作?
你看到双打的其他问题吗?
编辑:关于很久,这绝对是我们所想到的.我们正在做很多除法乘法,长期不会很好地处理(丢失小数和溢出),或者至少你必须非常小心你所做的.我的问题更多的是关于双打理论,基本上有多糟糕,是否可以接受不准确?
编辑2:不要试图解决我的软件,我不准确:).我重新提出这样一个问题:如果你只需要12个数字并且在显示/比较时你是否会翻倍,那么不准确的可能性有多大?
我想检查相等2分数.我认为我写的方法不正确,因为可能会失去准确性.我是对还是错?
public boolean equals(Rational r) {
return (double) numerator / denominator == (double) r.numerator / r.denominator;
}
Run Code Online (Sandbox Code Playgroud)