java - 如何在 Java 中将 $1319.2295689273974 舍入为 1319.23?

标签 java currency

我正在做一个每月付款项目,但我无法将美元金额精确到小数点后两位。我是编码新手,不知道这里是否缺少一些明显的东西。

这是我的代码:

double monthlyP = (1 + monthlyRate);//P = Payment
double power = Math.pow(monthlyP, numMonths);
       monthlyP = power * monthlyRate;
double monthlyP2 = power - 1;
double FmonthlyP = (monthlyP/monthlyP2) * principle;//F = final
       FmonthlyP = (FmonthlyP * 100)/Math.round(100);

它不断输出 1319.0 insted .23。我尝试将 Math.round 放在乘法部分的前面和后面,但我无法让它工作。

最佳答案

计算机使用 64 位来表示 double 。 64 位,因此可以精确保存 2^64 不同的值。

呃。

因为数字有无限多个,所以这是一个大问题。这意味着大多数(实际上是无限数量)数字根本无法用 double 表示。那么java是做什么的呢?它会简单地默默地四舍五入到它可以代表的最接近的祝福数字。

这样做的结果是,使用double作为货币是一个大错误

不要这样做。

最简单的方法是使用long,并表示您正在使用的货币金额的原子单位。美分兑换美元和欧元。聪是比特币。

然后,您的代码以“分”(或聪或诸如此类的东西)为单位执行所有操作。当您向用户“呈现”您的美分时,请通过格式化函数将其扔掉。现在整个“我如何舍入”问题已经没有意义了。

格式化函数示例:

public static String printEuro(long cents) {
   boolean negative = cents < 0;
   if (negative) cents = -cents;
   
   int wholes = cents / 100;
   int parts = cents % 100;
   return String.format("%s€%d.%02d", negative ? "-" : "", wholes, parts);
}

注意:long 也是 64 位,但 double 需要能够表示 1e3000.000123,而 long 则不能。如果我们谈论的是欧元,只要欧元总额不超过 18 位,一长就可以涵盖所有美分。即使整个国家每世纪的 GDP 也没有那么高。如果您确实需要走那么远,请尝试 BigInteger

关于java - 如何在 Java 中将 $1319.2295689273974 舍入为 1319.23?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64139345/

相关文章:

java - Zxing NotFoundException

java - 在 JSpinner 中显示货币

r - 从 CSV 解析货币值,转换为百万和十亿的数字后缀

javascript - "toLocaleString"在不同的浏览器上给出不同的输出

java - Eclipse 中的 JPA 项目和 EJB 项目有什么区别?

Java 对话框 - 查看是否单击了“确定”?

java - 计算地点与用户位置之间的距离Android Studio

java - 在 eclipse 中运行测试时生成 .bs 文件

Java:货币到语言环境的映射可能吗?

java - -1 java中的计算错误