Как двойное значение хранится в JVM и как JVM считывает соответствующее двоичное значение из памяти и преобразует его в десятичное значение? - PullRequest
1 голос
/ 27 мая 2020

Мы знаем, что если десятичное значение, такое как 2.4, будет сохранено в JVM, оно должно быть сначала преобразовано в двоичное значение. Но для своего преобразования logi c он не может преобразовать точное значение 2,4, вместо этого его преобразованное двоичное значение составляет приблизительно 2,3999999999999999.

public class Application {
  public static void main(String[] args) {
    double d = 2.4;
    System.out.println(d);
  }
}

Я думаю, JVM хранит это значение в памяти. Но пока System.out.println(d);, я думаю, сначала надо получить двоичное значение из памяти, а потом распечатать. Думаю, что достает из памяти 2.3999999999999999, вот распечатывает 2.4.

Может тут кто разница? Большое спасибо!

enter image description here

1 Ответ

4 голосов
/ 27 мая 2020

println использует Double.toString внутри для преобразования двойного числа в строку, которую затем можно распечатать.

Double.toString javado c говорит следующее:

Сколько цифр должно быть напечатано для дробной части m или a? Должен быть хотя бы один di git для представления дробной части, а сверх этого столько же цифр, сколько необходимо, чтобы однозначно отличить guish значение аргумента от соседних значений типа double . То есть предположим, что x - точное математическое значение, представленное десятичным представлением, созданным этим методом для конечного ненулевого аргумента d. Тогда d должно быть ближайшим к x двойным значением; или если два двойных значения одинаково близки к x, тогда d должно быть одним из них, а младший бит мантиссы d должен быть 0.

Важная часть здесь - «столько, сколько, но ровно столько цифр, сколько необходимо, чтобы однозначно отличить guish значение аргумента от соседних значений типа double ".

Это означает, что до тех пор, пока 2.4 ближе к фактическому значению в d, чем к любому другому возможному двойному значению, будет напечатано 2.4.

...