31

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

float res = quantity / standard;

我已经用几个值尝试了上述除法,但我总是得到错误,但是我在其他任何地方都尝试过并且正确的一个是:

世界各地:

13.6 = 6800 / 500;

爪哇:

13.0 = 6800 / 500;

我研究过 BigDecimal 和 BigInteger,但是我还没有找到一种方法来用它们创建这个除法,还有没有其他方法可以在 Java 中进行这种除法而不会出现精度错误?

任何帮助将不胜感激。

4

4 回答 4

81

您正在除整数,这意味着您正在使用整数除法

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

尝试以下操作:

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

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

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

float f = 6800 / 500;

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

float f = 6800f / 500;
              ^
于 2011-09-02T16:46:40.170 回答
4

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

double d = (double) 6800 / 500;

或者

double d = 6800.0 / 500;
于 2011-09-02T17:08:24.373 回答
1

就我而言,我正在这样做:

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

而不是“正确”:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
于 2017-01-12T10:58:17.270 回答
-1

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

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

于 2016-09-02T06:55:44.240 回答