【问题标题】:Best way in Java to convert a double (representing a price) to a long with a price scale of 8Java中将double(代表价格)转换为long的最佳方法,价格范围为8
【发布时间】:2020-04-05 21:28:29
【问题描述】:

在使用双精度表示价格的 Java 代码中,将双精度转换为价格刻度为 8 的长整数的最佳方法是什么?例如,{Double} 17.99 将转换为 {Long} 1799000000。双精度可能包含 2 到 4 位小数。

如下所示的简单代码有时可以正常工作:

 Double dprice = 17.99;
 Long lprice = (long) (dprice * 100000000);

但是,由于已知原因 (floating point guide),它可能会产生意想不到的结果。例如,在一次测试中,{Double} 17.99 转换为 {Long} 1798999999。

Java 中安全地进行这种转换的最佳选择是什么?在这种情况下是否需要 BigDecimal?

【问题讨论】:

  • "在这种情况下是否需要 BigDecimal?"将“双倍”价格存储为BigDecimal 是必要的。当你得到Double dprice = 17.99; 时,你已经失去了精确度。
  • 感谢您的信息。在这种情况下,BigDecimal 似乎确实是必要的。我认为可能还有其他一些选项,例如 Math.round。

标签: java double decimal


【解决方案1】:

为了保持精度,正如 Andy Turner 在 cmets 中指出的那样,在进行乘法等操作时,您必须使用 BigDecimals,直到最后。以下应该有效:

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 调用可用于设置您希望保留的确切小数位数。

【讨论】:

  • 感谢您的回答。代码工作正常,绝对是一种选择。
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多