久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

為什么 Math.round(0.49999999999999994) 返回 1?

Why does Math.round(0.49999999999999994) return 1?(為什么 Math.round(0.49999999999999994) 返回 1?)
本文介紹了為什么 Math.round(0.49999999999999994) 返回 1?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

在下面的程序中你可以看到每個略小于.5的值都被四舍五入了,除了0.5.

In the following program you can see that each value slightly less than .5 is rounded down, except for 0.5.

for (int i = 10; i >= 0; i--) {
    long l = Double.doubleToLongBits(i + 0.5);
    double x;
    do {
        x = Double.longBitsToDouble(l);
        System.out.println(x + " rounded is " + Math.round(x));
        l--;
    } while (Math.round(x) > i);
}

打印

10.5 rounded is 11
10.499999999999998 rounded is 10
9.5 rounded is 10
9.499999999999998 rounded is 9
8.5 rounded is 9
8.499999999999998 rounded is 8
7.5 rounded is 8
7.499999999999999 rounded is 7
6.5 rounded is 7
6.499999999999999 rounded is 6
5.5 rounded is 6
5.499999999999999 rounded is 5
4.5 rounded is 5
4.499999999999999 rounded is 4
3.5 rounded is 4
3.4999999999999996 rounded is 3
2.5 rounded is 3
2.4999999999999996 rounded is 2
1.5 rounded is 2
1.4999999999999998 rounded is 1
0.5 rounded is 1
0.49999999999999994 rounded is 1
0.4999999999999999 rounded is 0

我正在使用 Java 6 更新 31.

I am using Java 6 update 31.

推薦答案

總結

在 Java 6(可能更早)中,round(x) 被實現為 floor(x+0.5).1 這是一個規范錯誤,正是針對這種病態的情況.2Java 7 不再強制執行這種損壞的實現.3

In Java 6 (and presumably earlier), round(x) is implemented as floor(x+0.5).1 This is a specification bug, for precisely this one pathological case.2 Java 7 no longer mandates this broken implementation.3

問題

0.5+0.49999999999999994 在雙精度中正好是 1:

0.5+0.49999999999999994 is exactly 1 in double precision:

static void print(double d) {
    System.out.printf("%016x
", Double.doubleToLongBits(d));
}

public static void main(String args[]) {
    double a = 0.5;
    double b = 0.49999999999999994;

    print(a);      // 3fe0000000000000
    print(b);      // 3fdfffffffffffff
    print(a+b);    // 3ff0000000000000
    print(1.0);    // 3ff0000000000000
}

這是因為 0.49999999999999994 的指數小于 0.5,所以當它們相加時,它的尾數會移動,ULP 會變大.

This is because 0.49999999999999994 has a smaller exponent than 0.5, so when they're added, its mantissa is shifted, and the ULP gets bigger.

解決方案

從 Java 7 開始,OpenJDK(例如)這樣實現它:4

Since Java 7, OpenJDK (for example) implements it thus:4

public static long round(double a) {
    if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
        return (long)floor(a + 0.5d);
    else
        return 0;
}

<小時>

<子>1. http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#round%28double%29

<子>2. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675(感謝@SimonNickerson 找到這個)

2. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675 (credits to @SimonNickerson for finding this)

<子>3. http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#round%28double%29

<子>4. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/lang/Math.java#Math.round%28double%29

這篇關于為什么 Math.round(0.49999999999999994) 返回 1?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How to wrap text around components in a JTextPane?(如何在 JTextPane 中的組件周圍環繞文本?)
MyBatis, how to get the auto generated key of an insert? [MySql](MyBatis,如何獲取插入的自動生成密鑰?[MySql])
Inserting to Oracle Nested Table in Java(在 Java 中插入 Oracle 嵌套表)
Java: How to insert CLOB into oracle database(Java:如何將 CLOB 插入 oracle 數據庫)
Why does Spring-data-jdbc not save my Car object?(為什么 Spring-data-jdbc 不保存我的 Car 對象?)
Use threading to process file chunk by chunk(使用線程逐塊處理文件)
主站蜘蛛池模板: 国产黄视频在线播放 | 人人做人人澡人人爽欧美 | 精品一区欧美 | 亚洲欧美综合精品久久成人 | 日韩精品一区二区三区视频播放 | 成人影院在线视频 | 久草热视频 | 亚洲 91 | 国产a视频 | 影音先锋欧美资源 | 国产精品精品视频一区二区三区 | 337p日本欧洲亚洲大胆精蜜臀 | 国产中文字幕亚洲 | 91中文在线观看 | 国产一级片在线播放 | 精品国产乱码久久久久久牛牛 | 亚洲高清av在线 | 久久久久久国产一区二区三区 | 欧美一区二区小视频 | 国产九九九| 亚洲精品乱码 | 免费看国产一级特黄aaaa大片 | 欧美一区二区在线视频 | 97超碰人人草 | 日本成人中文字幕在线观看 | 日韩欧美视频免费在线观看 | 欧美成人精品一区二区三区 | 97精品超碰一区二区三区 | 亚洲欧美第一视频 | 国产精品成人av | 国产三区视频在线观看 | 欧美一级在线观看 | 美女在线视频一区二区三区 | 亚洲 欧美 综合 | 激情婷婷 | 国产精品视频播放 | 亚洲精品久久久久久下一站 | 日韩一区二区在线视频 | 色播av | 欧美色999 | 亚洲精品美女视频 |