从双精度创建 FastMoney/Money 有什么注意事项吗?
Are there any caveats of creating a FastMoney/Money from a double?
我 have seen 从 double
创建 BigDecimal
时出现问题。
尽管 FastMoney
不使用 BigDecimal
(与 Money
相对),但我不确定当我从 double
值。
是否不推荐从 double
创建 FastMoney
/Money
实例?我应该总是尝试从 String
创建它们吗?
double
尤其是 float
类型是危险的。这个数字是以 2 为基数的数字系统,因此不可能直接表示 0.24F
相同,不可能在没有循环小数点的十进制系统中表示 1/3
,即 1/3=0.3333...
或 0.(3)
.
因此,当打印回十进制表示法时,浮点数 0.24F
显示为 0.23
,但由于四舍五入而发生变化:
println(0.24F) => 0.23999999463558197021484375
而0.25F
可以直接显示:
println(0.25F) => 0.25
所以回答你的问题:这取决于。 0.25,0.5,0.75用double就可以了
但是 FastMoney class 使用的不是 floating-point arithmetic but a fixed-point arithmetic
我 have seen 从 double
创建 BigDecimal
时出现问题。
尽管 FastMoney
不使用 BigDecimal
(与 Money
相对),但我不确定当我从 double
值。
是否不推荐从 double
创建 FastMoney
/Money
实例?我应该总是尝试从 String
创建它们吗?
double
尤其是 float
类型是危险的。这个数字是以 2 为基数的数字系统,因此不可能直接表示 0.24F
相同,不可能在没有循环小数点的十进制系统中表示 1/3
,即 1/3=0.3333...
或 0.(3)
.
因此,当打印回十进制表示法时,浮点数 0.24F
显示为 0.23
,但由于四舍五入而发生变化:
println(0.24F) => 0.23999999463558197021484375
而0.25F
可以直接显示:
println(0.25F) => 0.25
所以回答你的问题:这取决于。 0.25,0.5,0.75用double就可以了
但是 FastMoney class 使用的不是 floating-point arithmetic but a fixed-point arithmetic