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

Java 为什么整数除法代码给出了错误的答案?,java,floating-point,division,integer-division,Java,Floating Point,Division,Integer Division,我在Java中有一个非常简单的划分,即每小时的产品数量/产量,但每当我进行此划分时,我都会遇到奇怪的错误: float res = quantity / standard; 我用几个值尝试了上面的除法,我总是会出错,但是我在其他地方尝试过,结果都是正确的: 世界各地: 13.6 = 6800 / 500; 爪哇: 我已经研究过BigDecimal和BigInteger,但是我还没有找到一种用它们来创建除法的方法,有没有其他方法可以在Java中进行除法而不会出现精度错误 任何帮助都将不胜感激。

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

float res = quantity / standard;
我用几个值尝试了上面的除法,我总是会出错,但是我在其他地方尝试过,结果都是正确的:

世界各地:

13.6 = 6800 / 500;
爪哇:

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


任何帮助都将不胜感激。

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

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

请尝试以下操作:

float res = (float) quantity / standard;
            ^^^^^^^
上面强制将分子视为浮点数,这反过来又促进分母也浮点数,并执行浮点数除法而不是整数除法

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

float f = 6800 / 500;
要包含f后缀以使分母成为浮点数:

float f = 6800f / 500;
              ^

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

double d = (double) 6800 / 500;


嗨,试试这个吧,它可能会满足你的要求

双百分比=7819140000l-3805200000l*100f/7819140000l; 公共字符串格式\u小数双小数{ NumberFormat nf=NumberFormat.getInstance; nf.SetMaximumFractionDigits 5; nf.SetMinimumFractionDigits 2; nf.SetRoundingModernoundingMode.HALF_向上; 字符串x=nf.formatdecimalNumber; 返回x;
} 就我而言,我是这样做的:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
而不是正确的:

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

世界上任何地方都无法重新分配文字的值-除非有特殊需要使用浮点,否则应该使用双元。世界上的任何地方都不包括C、C++。另一种常见的方法是将分子或分母乘以1。顺便说一句,除非你真的关心节省4个字节,否则几乎没有理由用float代替double。@Paul:所以没有理由用int代替long,除非。。。[-]卡洛斯,也许不是java,实际上我不知道,但是在C或C++中,int的速度要比长得快,但是由于数学协处理器,有些时候记住,这些是双芯片,它们往往比浮点数快,因为它们不必被转换。我一直在做一些简单的阅读,我可能有点担心内存的使用,软件将要部署的机器是相当旧的。Double使用了4个字节。如果内存非常紧,它可以值得使用float,如果你有一百万个float,它可以节省4 MB。如果你没有数百万个float,它可能不工作这令人担忧。
double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);