最少的惊喜原则

时间:2013-03-21 20:29:06

标签: java

double d = 0.0;
    for (int i = 0; i < 10; i++)
    {
        d = d+0.1;
    }
    System.out.println(d);

这是我在“最å°æƒŠå–œåŽŸåˆ™â€ä¸­è¯»åˆ°çš„一个例å­

我åªæ˜¯å¥½å¥‡ä¸ºä»€ä¹ˆä»£ç ä¼šè¿”回0.999999999,如果我将dçš„æ•°æ®ç±»åž‹æ›´æ”¹ä¸ºfloat,我得到1.0000001。这ç§è¡Œä¸ºèƒŒåŽçš„原因是什么。

1 个答案:

答案 0 :(得分:7)

这是浮点数ä¸ç²¾ç¡®çš„ç»å…¸æ¡ˆä¾‹ã€‚由于0.1ä¸èƒ½ä»¥äºŒè¿›åˆ¶å½¢å¼å¹²å‡€åœ°è¡¨ç¤ºï¼ˆå®ƒæ˜¯ä¸€ä¸ªé‡å¤çš„数字),因此éšç€æ•°å­—被åå¤æ·»åŠ åˆ°è‡ªèº«ä¸­ï¼Œå­˜åœ¨èˆå…¥è¯¯å·®ã€‚当我们改å˜æµ®åŠ¨æ—¶ï¼Œè¡Œä¸ºçš„差异æ°å¥½å½’结为在更多存储ä½çš„过程中实际ä¿æŒ0.1的差异。

如果您需è¦å分精确的å进制数表示,BigDecimal类将很快æˆä¸ºæ‚¨æœ€å¥½çš„朋å‹ã€‚基于它如何在内部存储å°æ•°çš„细节而ä¸ä¼šæŸå¤±ç²¾åº¦ï¼Œè®¡ç®—å¯ä»¥ä¿æŒå…¶å®Œæ•´æ€§ã€‚