我需要在Java中执行一些浮点运算,如下面的代码所示:
public class TestMain {
private static Map<Integer, Double> ccc = new HashMap<Integer, Double>() {
{ put(1, 0.01); put(2, 0.02); put(3, 0.05); put(4, 0.1); put(6, 0.2);
put(10, 0.5); put(20, 1.0); put(30, 2.0); put(50, 5.0); put(100, 10.0);
}
};
Double increment(Double i, boolean up) {
Double inc = null;
while (inc == null) {
inc = ccc.get(i.intValue());
if (up)
--i;
else
++i;
}
return inc;
}
public static void main(String[] args) {
TestMain tt = new TestMain();
for (double i = 1; i < 1000; i += tt.increment(i, true)) {
System.out.print(i + ",");
}
}
}
这是为了模拟Betfair Spinner小部件作为输出给出的值的范围。
Java中的浮点算术似乎引入了一些意外错误。例如,我得到2.180000000000001而不是2.18。浮点数有什么用,您不相信对它们执行的算术结果吗?我该如何解决这个问题?
如果您需要精确的十进制值,则应使用java.math.BigDecimal。然后阅读“每个计算机科学家应该知道的有关浮点运算的知识”,以了解获得这些结果的背景。
(我有一本以.NET为中心的文章,您可能会觉得它更容易阅读,并且肯定会更短。出于理解此问题的目的,Java和.NET之间的差异在很大程度上无关紧要。
我阅读关于浮点和舍入在浮点算术期间发生的错误。 我读了很多关于IEEE754单精度/双精度格式的文章。我知道有符号位、8(或)11位指数和23(或)52位有效位以及隐式前导位。 我也知道分母不是质因数2的实数不能完全表示,例如二进制中的0.1是0.0001100110011...... 我知道0.1 0.1 0.1不等于0.3,因为舍入误差的累积。 同样,0.5也可以用二进制格式表示,因为它是1/
我写了这段代码,它只是对n个数字的列表进行求和,以练习浮点运算,但我不明白这一点: 我正在使用float,这意味着我有7位精度,因此,如果我执行10002*10002=100040004的操作,数据类型float的结果将是100040000.000000,因为我丢失了第7位以外的任何数字(程序仍然知道指数,如图所示)。 如果此程序中的输入是 然而,您将看到,当这个程序计算30003*30003=9
问题 你需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。 解决方案 浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>> 这些错误是由底层CPU和IEEE 754标准通过
问题内容: 我在运行于多台计算机上的应用程序中使用Java,并且所有计算机都需要获得相同的数学运算结果。使用Java的浮点原语是否安全?还是应该只使用定点数学库? 问题答案: 一般而言,不。但是,您可以使用表达式: 在FP-strict表达式中,所有中间值都必须是浮点值集或double值集的元素,这意味着所有FP-strict表达式的结果必须是IEEE 754算法对使用单格式和双格式表示的操作数预
对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?
以下是go中的示例代码: 结果线A1、B1和C1之间的差异是可以理解的。然而,从A2开始到C2魔法来了。来自B2和C2的结果都与来自A2线的结果不匹配。对于x2行(x=A、B或C)也是如此——但是x2和x4的输出是相同的。 为了确保,让我们以二进制形式打印结果。 上面代码中的一些事实(一个在bin表单中): 行A11和C11之间有差异(最后一位数字——就在指数之前)。 行A12和C12几乎相同(除