Java-如何避免在除法转换为int时丢失精度?
我有一种情况,我需要找出一个整数转换成小数的次数,但在某些情况下,我会失去精度。方法如下:Java-如何避免在除法转换为int时丢失精度?,java,casting,int,precision,Java,Casting,Int,Precision,我有一种情况,我需要找出一个整数转换成小数的次数,但在某些情况下,我会失去精度。方法如下: public int test(double decimalAmount, int divisor) { return (int) (decimalAmount/ (1d / divisor)); } 问题是如果我把1.2作为十进制数,5作为除数,我得到的是5而不是6。我怎样才能重新调整它,这样我就知道小数位数是整数的5的多少倍了 public int test(double decimalAmou
public int test(double decimalAmount, int divisor) {
return (int) (decimalAmount/ (1d / divisor));
}
问题是如果我把1.2作为十进制数,5作为除数,我得到的是5而不是6。我怎样才能重新调整它,这样我就知道小数位数是整数的5的多少倍了
public int test(double decimalAmount, int divisor) {
return (int) (divisor * decimalAmount);
}
显然,这只是相乘然后截断。为什么你认为你需要这种方法
显然,这只是相乘然后截断。为什么您认为需要此方法?计算结果可能类似于5.9999999994,因为浮点结果不一定是整数。当您强制转换为int时,将截断,结果为5。对于另一组类似的参数,您可能会看到结果为6.0000000000002,它将为您提供6 但事实上,它对浮点表示非常敏感,这让人质疑为什么你认为你需要它——也许有更好的方法来做你想做的事情。例如,上面的答案是正确的,这简化了,然后就更不清楚重点是什么
要真正做到我认为你想象中你想做的事情,你不需要使用
double
s或float
s。您需要java.util.BigDecimal
——查看它是如何工作的。您可以使用它“精确”乘以5和1.2得到6。计算结果可能类似于5.9999994,因为浮点结果不一定是整数。当您强制转换为int时,将截断,结果为5。对于另一组类似的参数,您可能会看到结果为6.0000000000002,它将为您提供6
但事实上,它对浮点表示非常敏感,这让人质疑为什么你认为你需要它——也许有更好的方法来做你想做的事情。例如,上面的答案是正确的,这简化了,然后就更不清楚重点是什么
要真正做到我认为你想象中你想做的事情,你不需要使用
double
s或float
s。您需要java.util.BigDecimal
——查看它是如何工作的。您可以使用它“精确地”乘以5和1.2得到6。浮点运算不正确,它们是近似值。通过此操作,您可以得到例如5.9的结果。将其转换为int结果为5(而不是6)。尝试舍入而不是截断:
public int test(double decimalAmount, int divisor) {
return Math.round(divisor * decimalAmount);
}
浮点运算不正确,它们是近似值。通过此操作,您可以得到例如5.9的结果。将其转换为int结果为5(而不是6)。尝试舍入而不是截断:
public int test(double decimalAmount, int divisor) {
return Math.round(divisor * decimalAmount);
}
我认为你需要给出一个更一般化的问题——你使用的术语只对整数有意义,即5除以1.2=0/如果你改进定义,我怀疑你会得到答案,因为我怀疑这个问题是由于舍入,它与舍入无关,与公式有关。十进制除以整数就是简单(整数)(小数位数/除数)。我想这就是大卫想要的。就目前的情况来看,代码实际上是在做十进制数和除数的乘法。我认为你需要给出一个更一般化的问题版本-你使用的术语只对整数有意义,即5除以1.2=0/如果你确实改进了定义,我怀疑你会得到答案,因为我怀疑这个问题是由于舍入与舍入无关,与公式有关。小数除以整数是简单的(整数)(小数位数/除数)。我想这就是大卫想要的。目前的情况是,代码有效地进行了十进制数和除数的乘法运算。java.math.BicDecimal现在是java.math.BicDecimal