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 methodfinal 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 * 10final 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