2012-12-18 59 views
1

我发现用google搜索的所有内容都表示下面的任何一项都会将双精度值减小到两位小数。双精度降低

double roundToFourDecimals(double d) 
{ 
    DecimalFormat twoDForm = new DecimalFormat("#.##"); 
    double myD = Double.valueOf(twoDForm.format(d)); 
    return myD; 
} 

double nextLon = (double)Math.round(bnextLon * 100.0)/100.0; 

但是这两种都不适用于我。 double的值是3.3743984E7,结果是一样的。 有什么问题?

+0

有趣的是,我假设这个工作正常,即使Double的可用“精度”超出小数点位置。是否有人知道在乘法产生效果的情况下是否存在截断值,但_division_不会(显然,无论如何,百分之一的位置都会消失很久)。 –

回答

5

没什么不对。 3.3743984E7是科学记数法。即:

3.3743984E7 = 3.3743984 * 10^7 = 33743984 

33743904.0四舍五入到小数点后两位是33,743,984.0。 如果,也许你指定了33743984.05918,它将四舍五入到33743984.06,但两个输出仍然会说3.3743984E7(前面的评论已被删除由于@Sam发现无效。)

can verify that your rounding code works

public class Main { 
    public static void main(String[] args) { 
     double bnextLon = 275914.18410; 
     double nextLon = (double) Math.round(bnextLon * 100.0)/100.0; 
     System.out.println(bnextLon + " became " + nextLon); 
    } 
} 

275914.1841 became 275914.18

我相信,你只需要确定你想要什么价值在,你想要什么价值。代码完全给你你指定的内容。

+1

嗯,你更新了你的答案。虽然它仍然是正确的,但我不同意'33743984.06'是'3.3743984E7'。小数不一定四舍五入,即“33743984.06”是“3.374398406E7”。 – Sam

+0

@萨姆啊,好点。我认为这是截点,但似乎[这是更深入](http://ideone.com/xT7w5l)。会改变这一点。 – Eric

+0

Eric:用你的第一条指令代替:double bnextLon = 3.1234567E7;你会看到发生了什么 - 它不是圆的。如果双方在科学记数法,它不起作用。我必须弄清楚如何将它转换成十进制符号。它在存储器中的存储方式有所不同。 –

2

3.3743984E7意味着33743984,所以乘以100给出3374398400,然后四舍五入改变什么都没有,然后除法返回。

你应该除以1E5然后回合。