我在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
*/
我宁愿不增加阈值( 0.5d ),因为在类似情况下我也不安全(当我开始编码时,规范将 0.1d 作为比较值)。如果这是唯一的解决方案,那么
0.9d 的值是解决此问题的最安全值吗?
我该如何解决这种情况?我认为这个问题是由于使用双变量引起的,但是对于浮点数,我也遇到了同样的问题。
有什么想法(如果可能的话,有一些经过测试的代码行;))?
您可能会舍入错误,但是我在这里看不到它。
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新手。我收到字节数组中的UDP数据。字节数组的每个元素都具有十六进制值。我需要将每个元素转换为整数。 如何将其转换为整数? 问题答案: 样例代码:
我有十六进制字符串,例如“0x103E”,我想将其转换为整数。意思是to我尝试了但它给出了数字格式异常。我如何实现这一点?
问题内容: 我有一个代表2的补码的十六进制字符串。是否有一种简单的方法(库/函数)将十六进制转换为十进制而不直接使用其位? EG这是给定左侧十六进制的预期输出: 谢谢! 问题答案: 这似乎在欺骗Java转换数字而不强制给出正结果: 当然,这种情况仅适用于8、16、32和64位2的补码:
问题内容: 我有一个家庭作业,需要在十进制,二进制和十六进制之间进行三向转换。我需要帮助的功能是将十进制转换为十六进制。我几乎不了解十六进制,但是如何将十进制转换为十六进制。我需要一个接受并返回的函数。不幸的是我没有此功能的任何草稿,我完全迷路了。我只有这个。 另外,我不能使用诸如Integer.toHexString()之类的预制函数或任何其他东西,我需要真正地制作算法,否则我什么都不会学。 问
问题内容: 我正在尝试将String十六进制转换为整数。从哈希函数(sha-1)计算出十六进制字符串。我收到此错误:java.lang.NumberFormatException。我猜它不喜欢十六进制的String表示形式。我该如何实现。这是我的代码: 例如,当我传递以下字符串: _DTOWsHJbEeC6VuzWPawcLA时 ,他的哈希值是: 0xC934E5D372B2AB6D0A50B9F
问题内容: 如上面的标题。我想从一个十六进制数字 我想转换为。 问题答案: