2011-09-02 84 views
25

我在Java的一个非常简单的除法(它每小时的产品数量/产量),但每当我做出这样的划分,我得到奇怪的错误:为什么整数除法码给出了错误的答案?

float res = quantity/standard; 

我已经尝试了上述部门与一些价值观和我总是出现错误,但是,我试过其他地方,并得到了一个正确的,这是:

在世界各地:

13.6 = 6800/500; 

的Java:

13.0 = 6800/500; 

我研究BigDecimal和BigInteger的,但是我还没有找到一种方法来创建这个师与他们没有任何其他办法可以做到这样的划分在Java中,而无需精度误差?

任何帮助将不胜感激。

+8

“在世界各地”你不能重新分配文字;-)的价值,除非有使用'浮特定需要 –

+0

你应该使用'double' '。 – starblue

+3

“世界上任何地方”都不包括C,C++吗? – djechlin

回答

71

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

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

尝试以下方法:

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

上述力的分子被视为一个float从而促进分母浮动以及,并且执行代替一个int分浮子除法。

请注意,如果你处理的文字,你可以改变

float f = 6800/500; 

到包括f后缀,使分母的浮动:

float f = 6800f/500; 
      ^
+3

另一种常见方法是将分子或分母乘以1.0。顺便说一下,几乎没有理由使用float而不是double,除非你真的关心保存4个字节。 –

+4

@Paul:所以没有理由使用int而不是long,除非... [:-) –

+0

@Carlos,也许不是Java(实际上,我不知道),但是在C或C++中, int可以比long更快,但是由于“数学协处理器”(有些人记得这些是单独的芯片时),双打通常比浮点数快,因为它们不必被下变换。 –

3

如果你关心我的精度会建议使用double,它的精度数位数增加了一倍以上。但是浮点数只能精确地表示0.5的和或0.5的幂。这意味着0.6只是近似代表。这不一定是适当舍入的问题。

double d = (double) 6800/500; 

double d = 6800.0/500; 
+0

双精度和浮点精度之间是否存在性能差异?....我一直在进行一些轻量级读取,并且我可能会对内存使用情况有点担忧,软件将要部署到的机器相当老旧 –

+0

double使用4个字节。如果内存非常紧张,可以使用'float',如果你有一百万个,它可以节省4 MB。如果你没有上百万个这可能不值得担心。 –

+1

那,机器不老 –

0

喜试试这个,它可以帮助FUL您的要求

double percent=(7819140000l-3805200000l)*100f/7819140000l; 
 

 
public String format_Decimal(double decimalNumber) { 
 
\t \t NumberFormat nf = NumberFormat.getInstance(); 
 
\t \t nf.setMaximumFractionDigits(5); 
 
\t \t nf.setMinimumFractionDigits(2); 
 
\t \t nf.setRoundingMode(RoundingMode.HALF_UP); 
 
\t \t String x = nf.format(decimalNumber); 
 
\t \t return x; 
 
\t }

0

在我来说,我这样做:

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

取而代之的是“正确的”:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1); 
相关问题