Java 中将双精度数(代表价格)转换为价格标度为 8 的多头数的最佳方法
Best way in Java to convert a double (representing a price) to a long with a price scale of 8
在使用双精度数表示价格的 Java 代码中,将双精度数转换为价格标度为 8 的多头数的最佳方法是什么?例如,{Double} 17.99 将转换为 {Long} 1799000000。double 可能包含 2 到 4 个小数位。
像下面这样的简单代码有时可以正常工作:
Double dprice = 17.99;
Long lprice = (long) (dprice * 100000000);
但是,由于已知原因 (floating point guide),它可能会产生意外结果。例如,在一个测试中,{Double} 17.99 转换为 {Long} 1798999999。
Java 中安全进行此转换的最佳选项是什么?在这种情况下是否需要 BigDecimal?
为了保持精度,正如 Andy Turner 在评论中指出的那样,在进行乘法等操作时必须使用 BigDecimal
s,直到最后。以下应该有效:
import java.math.BigDecimal;
import java.math.RoundingMode;
class Main {
public static void main(String[] args) {
BigDecimal dprice = BigDecimal.valueOf(17.99).setScale(2, RoundingMode.HALF_UP);
Long lprice = dprice.multiply(BigDecimal.valueOf(100000000)).longValue();
System.out.println(lprice);
}
}
setScale
调用可用于设置您希望保留的确切小数位数。
在使用双精度数表示价格的 Java 代码中,将双精度数转换为价格标度为 8 的多头数的最佳方法是什么?例如,{Double} 17.99 将转换为 {Long} 1799000000。double 可能包含 2 到 4 个小数位。
像下面这样的简单代码有时可以正常工作:
Double dprice = 17.99;
Long lprice = (long) (dprice * 100000000);
但是,由于已知原因 (floating point guide),它可能会产生意外结果。例如,在一个测试中,{Double} 17.99 转换为 {Long} 1798999999。
Java 中安全进行此转换的最佳选项是什么?在这种情况下是否需要 BigDecimal?
为了保持精度,正如 Andy Turner 在评论中指出的那样,在进行乘法等操作时必须使用 BigDecimal
s,直到最后。以下应该有效:
import java.math.BigDecimal;
import java.math.RoundingMode;
class Main {
public static void main(String[] args) {
BigDecimal dprice = BigDecimal.valueOf(17.99).setScale(2, RoundingMode.HALF_UP);
Long lprice = dprice.multiply(BigDecimal.valueOf(100000000)).longValue();
System.out.println(lprice);
}
}
setScale
调用可用于设置您希望保留的确切小数位数。