Java中的十进制数字总和

我在java(JDK 1.4)中对小数的管理有问题。

我的 有两个 精度数字(作为格式化 String的

输出)。我在拳头和秒针之间求和,并且我得到一个带有更多十进制数字的数字! *** __

   final double first=198.4;//value extract by unmodifiable format method

final double second=44701.2;//value extract by unmodifiable format method

final double firstDifference= first+second; //I receive 44899.598 instead of 44899.6

final double calculatedDifference=44900.1; // comparison value for the flow

final double error=firstDifference-calculatedDifference;// I receive -0.50390605 instead 0.5

if(Math.abs(error)<=0.5d)){

//I must enter in this branch but the error not allows the correct flow!!!

}

/***

* the flow of program is uncorrect and there's a very visible bug in business view

*/

我宁愿不增加阈值( ),因为在类似情况下我也不安全(当我开始编码时,规范将 作为比较值)。如果这是唯一的解决方案,那么

的值是解决此问题的最安全值吗?

我该如何解决这种情况?我认为这个问题是由于使用双变量引起的,但是对于浮点数,我也遇到了同样的问题。

有什么想法(如果可能的话,有一些经过测试的代码行;))?

回答:

您可能会舍入错误,但是我在这里看不到它。

final double first=198.4;//value extract by unmodifiable format method

final double second=44701.2;//value extract by unmodifiable format method

final double firstDifference= first+second; //I receive 44899.6

final double calculatedDifference=44900.1; // comparison value for the flow

final double error=firstDifference-calculatedDifference;// I receive -0.5

if(Math.abs(error)<=0.5d){

// this branch is entered.

System.out.println(error);

}

版画

-0.5

有两种方法可以更一般地处理此问题。您可以定义一个舍入误差,例如

 private static final double ERROR = 1e-9;

if(Math.abs(error)<=0.5d + ERROR){

或使用舍入

final double firstDifference= round(first+second, 1); // call a function to round to one decimal place.

或使用固定精度的整数

final int first=1984;// 198.4 * 10

final int second=447012; // 44701.2 * 10

final int firstDifference= first+second; //I receive 448996

final int calculatedDifference=449001; // comparison value for the flow

final int error=firstDifference-calculatedDifference;// I receive -5

if(Math.abs(error)<=5){

// this branch is entered.

System.out.println(error);

}

或者您可以使用BigDecimal。这通常是许多开发人员的首选解决方案,但恕我直言。;)

以上是 Java中的十进制数字总和 的全部内容, 来源链接: utcz.com/qa/400747.html

回到顶部