为什么整数除法码给出了错误的答案?
我在Java中有一个非常简单的部门(这是一个产品数量/每小时生产),但是无论何时我做这个部门,我都会遇到奇怪的错误:
float res = quantity / standard;
我已经尝试了以上的几个值的分工,我总是得到错误,但是我尝试了其他地方,并得到正确的是这样的:
世界上任何地方:
13.6 = 6800 / 500;
Java的:
13.0 = 6800 / 500;
我已经研究了BigDecimal和BigInteger,但是我还没有find一种方法来与他们创build这个部门,还有没有其他的方式来做这个部门在Java中没有精度错误?
任何帮助将不胜感激。
你正在分割整数,这意味着你正在使用整数除法 。
在整数除法中,结果的小数部分被丢弃。
尝试以下操作:
float res = (float) quantity / standard; ^^^^^^^
上面的分子被看作是一个float
的分子,这又促使分母浮动,并且执行浮动分割而不是整数分割。
请注意,如果你正在处理文字,你可以改变
float f = 6800 / 500;
包含f
后缀以使分母浮动:
float f = 6800f / 500; ^
如果你关心精度,我会build议使用double
精度数字的两倍以上。 然而,浮点数只能精确地表示0.5的和或0.5的幂的分数。 这意味着0.6只是近似表示。 这并不是一个适当的四舍五入问题。
double d = (double) 6800 / 500;
要么
double d = 6800.0 / 500;
嗨尝试这一个它可能有助于满足您的要求
double percent=(7819140000l-3805200000l)*100f/7819140000l; public String format_Decimal(double decimalNumber) { NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(5); nf.setMinimumFractionDigits(2); nf.setRoundingMode(RoundingMode.HALF_UP); String x = nf.format(decimalNumber); return x; }
在我的情况下,我是这样做的:
double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
而不是“正确的”:
double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);