所有double的Java总和未返回预期结果

所有double的Java总和未返回预期结果,java,sum,double,floating-accuracy,decimalformat,Java,Sum,Double,Floating Accuracy,Decimalformat,可能重复: 为什么下列数字之和不等于0.4622?但是0.462199999994 Double total = new Double(0.08) + new Double(0.0491) + new Double(0.3218) + new Double(0.0113) + new Double(0.0); // = 0.46219999999999994 我有一个检查用户输入的应用程序 用户输入5个十进制数和一个总数。应用程序将检查komma后面限制为4位小数的所有5

可能重复:

为什么下列数字之和不等于
0.4622
?但是
0.462199999994

Double total = new Double(0.08) + new Double(0.0491) + new Double(0.3218) + 
         new Double(0.0113) + new Double(0.0); // = 0.46219999999999994
我有一个检查用户输入的应用程序

用户输入5个十进制数和一个总数。应用程序将检查komma后面限制为4位小数的所有5个数字的总和是否等于总数

给它加上上限会得到
0.4621
,这不等于
0.4622
。我不能使用DecimalFormat,因为它会将其取整。如果我明确地说,四舍五入,那么在这种情况下它将失败


有没有关于如何解决这个问题的建议?

这是另一个取整问题。你永远不应该比较双打而期望它们完全相等。相反,定义一个小的epsylon,并期望结果在预期答案的epsylon范围内。

尝试使用
java.math.BigDecimal
。结果是两轮。您只需使用
add
方法,而不是+运算符。

如果需要精确答案,请避免使用float和double--第48项----有效Java第二版


改用
BigDecimal

看起来像是浮点算术的经典案例。如果需要精确计算,请使用
java.math.BigDecimal
。查看一下

任何浮点值都是不精确的。解决方案是在必须显示值时使用的。不,它不是四舍五入而是最接近的值

从javadoc:

十进制格式使用半偶数舍入(请参见舍入半偶数)表示 格式化


浮点表示是一种近似值,所以在使用float和double时会有这些小的舍入误差。例如,如果您尝试将0.08转换为二进制,您将意识到您实际上无法准确地进行转换。每当你在计算中使用双和浮点时,你需要考虑这个问题。

0.0810=0.0000100011110101110…2


重复的模式。因此,无论使用多少位,这都会产生舍入误差。

浮点数(如Double)的内部表示形式从来都不是精确的。这就是为什么在计算过程中会出现这种错误


通常建议将此类结果的格式设置为超过逗号的特定位数,这样您的结果将正确显示为“0.4622”,包含4到15个或更多数字。

也许直接检查字符串输入对您来说更可行。即检查小数点后的字符长度。

使用浮点运算时,还必须使用适当的舍入

顺便说一句:当基本体可以使用时,不要使用对象

double total = 0.08 + 0.0491 + 0.3218 + 0.0113 + 0.0;
System.out.printf("%.4f%n", total);

double rounded = Math.round(total * 1e4) / 1e4;
if (rounded == 0.4622)
    System.out.println("rounded matched");
印刷品

0.4622
rounded matched

正如所料。

Java中的Double和float在内部表示为二进制分数,因此在表示十进制分数时可能不精确(IEEE标准754)。如果您的十进制数计算需要精度,请使用。

十进制格式是否“四舍五入”?你确定?来自javadoc:“DecimalFormat使用半偶数舍入(请参阅舍入半偶数)进行格式设置。”舍入
0.462199999994
而不仅仅是截断goes给出正确答案。。不管怎样,浮点运算总是因其缺乏精确性而臭名昭著。感谢您提供的信息,这帮助了我以及vishal_aim的“可能的重复”