В некоторых случаях ближайшее float
представление к числовому количеству может отличаться от значения, полученного округлением ближайшего double
представления до float
.Два таких количества - 12 344 321,4999999991 и 12 345 678,50000000093.Целые числа выше и ниже обеих этих величин точно представлены как float
, но ближайшая double
к каждой из них имеет дробную часть точно 0,5.Поскольку преобразование таких значений double
(между 2 ^ 23 и 2 ^ 24, с долей точно 0,5) в float
будет округлять до ближайшего четного целого числа;в каждом случае компилятор будет округлять значение, которое было бы ближе к исходному числу.
Обратите внимание, что на практике компилятор, кажется, анализирует числа как double
, а затем преобразует в float
, поэтому даже если 12344321.4999999991f должен округляться до 12344321f, он вместо этого округляется до 12344322f.Аналогично, 12345678.50000000093f следует округлять до 12345679f, но округлять до 12345678f, поэтому даже в случаях, когда преобразование в double
, а затем float
теряет точность, таких потерь преобразования невозможно избежать, указав числа непосредственно как float
.
Между прочим, значения 12344321.4999999992f и 12345678.50000000094f округлены правильно.