![]() |
1
0
因为浮点数和双倍数不能准确地表示我们用于货币的10倍基数。这个问题不仅仅针对Java,还针对任何使用基2浮点类型的编程语言。 -2 (整数乘以10的幂)。 IEEE-754 floating-point numbers 它们是不同的,但是考虑它们的一个非常简单的方法是乘以二的幂。例如,你可以看到164*2 (整数乘以二的幂),也等于10.25。这不是数字在内存中的表示方式,但数学含义是相同的。 即使以10为基数,这个符号也不能准确地表示最简单的分数。例如,您不能表示1/3:十进制表示法是重复的(0.3333…),因此没有可以乘以10的幂得到1/3的有限整数。你可以选择一个3的长序列和一个小指数,比如333*10 -10 然而,为了计算货币,至少对于货币价值在美元数量级以内的国家来说,通常你所需要的只是能够存储10的倍数 -2 ,所以1/3不能表示并不重要。 绝大多数 像金钱一样的数字,没有一个整数乘以2的幂的精确表示。事实上,0到1之间的0.01的倍数(在处理货币时非常重要,因为它们是整数美分)可以精确地表示为IEEE-754二进制浮点数,它们是0、0.25、0.5、0.75和1。其他的都少了一点。与0.333333示例类似,如果将浮点值取为0.1,然后将其乘以10,则得不到1。
一个几乎适用于任何语言的解决方案是使用整数代替,并计算美分。例如,1025美元等于10.25美元。一些语言还内置了处理金钱的类型。其中,Java具有
|
![]() |
2
-1
不过
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 7 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 7 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 7 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 7 月前 |