原文はこちら。
The original article was written by David Delabassee (DevRel – Java Platform Group at Oracle).
https://inside.java/2022/09/23/quality-heads-up/
OpenJDK Quality Groupは、リリースの全体的な品質向上の手段としてOpenJDK Early Accessビルドを使ってのFOSSプロジェクトのテストを推進しています。
Quality Outreach
https://wiki.openjdk.java.net/display/quality/Quality+Outreach
このHeads upは、関係するプロジェクトに送られる定期的なコミュニケーションの一部です。
JDK 19 GA, JDK 20 EAb16, and some heads-up!
https://mail.openjdk.org/pipermail/quality-discuss/2022-September/001096.html
このプログラムの詳細と参加方法については、上記wikiをご覧ください。
JDK 19 – Double.toString()
and Float.toString()
changes
Java 19 で、Double.toString(double)
と Float.toString(float)
に影響する不具合が修正されました。
[JDK-4511638] Double.toString(double) sometimes produces incorrect results
https://bugs.openjdk.org/browse/JDK-4511638
Javadoc によると、Double.toString(double)
は、このdouble値と隣接するdouble値を一意に区別できる、できるだけ小さい桁数の文字列を生成しなければならないのですが、多くのdouble値ではそうではありませんでした。例えば、1e23
と9.999999999999999E22
は同じdouble値なのですが、1e23
を Double.toString(double)
に渡すと"9.999999999999999E22"
を返していました。
仕様がアップデートされ、それに伴い実装も更新されました。その結果、JDK19から、生成される文字列のいくつかは、以前のリリースで生成されたものよりも短くなりました。たとえば、JDK 19でこのメソッドに1e23
を渡すと、以前のJDK リリースでは"9.999999999999999E22"
でしたが、"1.0E23"
を返します。JDK 19では、9.999999999999999E22
をこのメソッドに渡しても、同じdouble値であるため1.0E23
を返すことに注意しましょう。仕様の更新に合わせて、doubleやfloatの多くの文字列表現が変更されています。
$ jshell
| Welcome to JShell -- Version 19
| For an introduction type: /help intro
jshell> double v1 = 9.999999999999999E22;
v1 ==> 1.0E23
jshell> double v2=1e23;
v2 ==> 1.0E23
jshell> Double.toString(v1)
$3 ==> "1.0E23"
jshell> Double.toString(v2)
$4 ==> "1.0E23"
More information
詳細は、リリースノートおよび修正そのものをご覧ください。
[JDK-8291475] Release Note: Double.toString(double) and Float.toString(float) may Return Slightly Different Results
https://bugs.openjdk.org/browse/JDK-8291475
[JDK-4511638] Double.toString(double) sometimes produces incorrect results
https://bugs.openjdk.org/browse/JDK-4511638
Joe Darcyの素晴らしいセッション動画 “Floating-Point Arithmatic : What Every Java Programmer Should Know!” で浮動小数点演算について学ぶのもよいでしょう。