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
。然而,浮点仅准确地表示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.设置舍入模式(舍入模式半向上);
字符串x=nf.格式(小数);
返回x;

}
就我而言,我是这样做的:

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


“世界各地”不能重新分配文字的值;-)除非有特殊的需要使用<代码>浮点,否则你应该使用<代码>双< />代码。“世界上的任何地方”都不包括C、C++。另一种常见的方法是将分子或分母乘以1。顺便说一句,除非你真的关心节省4个字节,否则几乎没有理由用float代替double。@Paul:所以没有理由用int代替long,除非。。。(卡洛斯),也许不是java(实际上,我不知道),但是在C或C++中,int比长得快得多,而得益于“数学协处理器”(有些时候,当它们是分开的芯片时,请记住)double通常比float快,因为它们不需要下变频。double和float之间有什么性能差异吗???…我一直在做一些轻微的读取,我可能有点担心内存使用情况,软件要部署的机器比较旧double多使用4个字节。如果它非常紧凑,值得使用
float
,如果你有一百万个,它可以节省4MB。如果你没有几百万个,它可能不值得担心。
double d = 6800.0 / 500;
double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);