我正在做一个每月付款项目,但我无法将美元金额精确到小数点后两位。我是编码新手,不知道这里是否缺少一些明显的东西。
这是我的代码:
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 需要能够表示 1e300
或 0.000123
,而 long 则不能。如果我们谈论的是欧元,只要欧元总额不超过 18 位,一长就可以涵盖所有美分。即使整个国家每世纪的 GDP 也没有那么高。如果您确实需要走那么远,请尝试 BigInteger
。
关于java - 如何在 Java 中将 $1319.2295689273974 舍入为 1319.23?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64139345/