【发布时间】:2020-11-03 11:37:16
【问题描述】:
我正在编写一个带有变量long balance 的银行程序来将美分存储在一个帐户中。当用户输入金额时,我有一种方法可以将美元转换为美分:
public static long convertFromUsd (double amountUsd) {
if(amountUsd <= maxValue || amountUsd >= minValue) {
return (long) (amountUsd * 100.0)
} else {
//no conversion (throws an exception, but I'm not including that part of the code)
}
}
在我的实际代码中,我还检查了amountUsd 的小数位数不超过 2 位,以避免无法准确转换的输入(例如 20.001 美元不完全是 2000 美分)。对于此示例代码,假设所有输入都有 0、1 或 2 个小数。
起初我查看Long.MAX_VALUE(9223372036854775807 美分)并认为double maxValue = 92233720368547758.07 是正确的,但它给了我大量的舍入错误:
convertFromUsd(92233720368547758.07) 给出输出 9223372036854775807
convertFromUsd(92233720368547758.00) 给出相同的输出 9223372036854775807
我应该如何设置double maxValue 和double minValue 才能始终获得准确的返回值?
【问题讨论】:
-
对于货币交易使用大十进制代替,它们很慢但精度要好得多