Здравствуйте, 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.
У него есть режим вывода "самое короткое представление"? Я быстрым гуглением не нашёл.