为什么整数除法代码给出了错误的答案?

时间:2011-09-02 16:45:11

标签: java floating-point division integer-division

我在Java中有一个非常简单的划分(它是每小时的产品数量/产量),但每当我进行这个划分时,我都会遇到奇怪的错误:

float res = quantity / standard;

我已经尝试了上面的几个值的分区,但我总是会遇到错误,但是我在其他地方尝试过的那个错误就是这样:

世界各地:

13.6 = 6800 / 500;

爪哇:

13.0 = 6800 / 500;

我研究过BigDecimal和BigInteger,但我还没有找到一种方法来创建这个除法,有没有其他方法在Java中进行这种划分而没有精度错误?

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:73)

你正在划分整数,这意味着你正在使用整数除法

在整数除法中,结果的小数部分被丢弃。

尝试以下方法:

float res = (float) quantity / standard;
            ^^^^^^^

上面强制将分子视为float,这反过来促使分母浮动,并且执行浮点除法而不是整数除法。

请注意,如果您正在处理文字,则可以更改

float f = 6800 / 500;

包含f后缀以使分母成为浮点数:

float f = 6800f / 500;
              ^

答案 1 :(得分:3)

如果您关心精度,我建议使用double,它的精度位数是精度的两倍以上。然而,浮点仅精确地表示为0.5的幂或幂的分数。这意味着0.6仅近似表示。这不一定是适当舍入的问题。

double d = (double) 6800 / 500;

double d = 6800.0 / 500;

答案 2 :(得分:1)

就我而言,我这样做:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));

而不是"正确" :

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);

答案 3 :(得分:0)

嗨试试这个可能有助于满足您的要求

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;
	}

相关问题