Re[2]: Java пытается маскировать неточную природу double-ов
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 22.02.22 12:45
Оценка:
Здравствуйте, halo, Вы писали:

H>Я в этом аспекте совершенно не силён, но java.lang.Object.toString() тут ни при чём, как и форматирование. 0.3d — константа с точки зрения языка, и именно в таком виде javac отдаёт значение в пул констант в класс-файла: 0x3FD3333333333333. Почему это считается 0.3d, а не 0.299999999999999988897769753748434595763683319091796875000000 -- не знаю.


На этом уровне действительно имеет смысл говорить о самом коротком представлении, равном данному.

H> И, навскидку, так же ведут себя JavaScript (V8), Python 2.7 в своих REPL-ах, в то время как, например, вывод System.Console.WriteLine() в C# округляет сумму в любом случае (даже если "замаскировать" исходные значения за методами, или использовать System.String.Format("{0:F...}") и System.BitConverter.Int64BitsToDouble; "читерит" даже больше чем Java). Т.е., должно быть стандартное правило, допускающее такое поведение.


Кто читерит в C#, я не понял. Вот у меня дотнет 7.0.100-preview.1.22110.4 (из снапа убунты).

  Скрытый текст
double a = 0.3;
Console.WriteLine("{0:F14}", a);
Console.WriteLine("{0:F15}", a);
Console.WriteLine("{0:F16}", a);
Console.WriteLine("{0:F17}", a);
Console.WriteLine("{0:F18}", a);
Console.WriteLine("{0:F19}", a);
Console.WriteLine("{0:F54}", a);
double b = 0.1;
b *= 3;
Console.WriteLine("{0:F14}", b);
Console.WriteLine("{0:F15}", b);
Console.WriteLine("{0:F16}", b);
Console.WriteLine("{0:F17}", b);
Console.WriteLine("{0:F18}", b);
Console.WriteLine("{0:F19}", b);
Console.WriteLine("{0:F54}", b);


Запускаю:

0.30000000000000
0.300000000000000
0.3000000000000000
0.29999999999999999
0.299999999999999989
0.2999999999999999889
0.299999999999999988897769753748434595763683319091796875
0.30000000000000
0.300000000000000
0.3000000000000000
0.30000000000000004
0.300000000000000044
0.3000000000000000444
0.300000000000000044408920985006261616945266723632812500


По-моему, всё честно без обсуждаемых шуток Java.

У него есть режим вывода "самое короткое представление"? Я быстрым гуглением не нашёл.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.