Явное преобразование двойного значения в число с плавающей точкой и его сохранение в двойной переменной - PullRequest
0 голосов
/ 03 июня 2018

Если я создаю двойную переменную и присваиваю ей, например, выражение (5d / 3d) и конвертирую в float явно, например,

 double c = (float)(5d / 3d);
 System.out.println(c);

ВЫХОД:

1.6666666269302368

Этодолжен был дать точность типа данных float, так как float меньше, чем double, поэтому переменная double не должна иметь проблем с сохранением значения float, но вывод абсурден.Почему это так?

Пожалуйста, помогите мне понять вывод этого кода.Я не могу понять этот вывод в коде.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Мои навыки Java очень ржавые, но я думаю, что здесь произошло то, что когда вы приводите результат деления к float, вы отбрасываете половину точности.Затем, когда вы сохранили его в double и передали его в System.out.println, System.out.println попытался напечатать его до десятичного знака в десятке разрядов.

Но из-за приведения эти десятичные разряды являются неточными,System.out.println фактически изобрел их.Попробуйте удалить приведение, посмотрите, что вы получите, или напечатайте результат как float.Выполнение любого из них должно дать более ощутимые результаты.

0 голосов
/ 03 июня 2018

Это из-за того, как битовая структура организована, когда вы делите пять и три, это неточное значение с плавающей запятой (это 1.6666666 и крошечный бит).Просто как тот.Чтобы продемонстрировать,

float f = (float) (5.0 / 3);
System.out.printf("%f=%s %s=%s%n", f, Float.toHexString(f), 
        (double) f, Double.toHexString(f));
System.out.printf("%s=%s %s=%s%n", f, Float.toHexString(f), 
        (double) f, Double.toHexString(f));

Вывод будет

1.666667=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0
1.6666666=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0

В обоих случаях вы заметите, что битовая комбинация постоянна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...