В мире двоичного формата IEEE 754 двойной точности с плавающей запятой (те, которые используются в Intel и других процессорах) 0.1 + 0.2 == 0.30000000000000004
:-) И 0.30000000000000004 != 0.3
(и обратите внимание, что в изумительном мире double
с, 0,1, 0,2 и 0,3 не существуют как «точные» величины. Есть несколько двойных чисел, которые очень близки к ним, но если вы напечатаете их с полной точностью, они не будут 0,1, 0,2 и 0,3)
Чтобы немного посмеяться, попробуйте это: http://pages.cs.wisc.edu/~rkennedy/exact-float
Вставьте десятичное число и посмотрите на второй и третий ряд, оно показывает, как число действительно представлено в памяти. Это для Delphi, но Double
и Single
одинаковы для Delphi и, вероятно, для всех компиляторов C для процессоров Intel (они называются double
и float
в C)
И если вы хотите попробовать сами, посмотрите на это http://ideone.com/WEL7h
#include <stdio.h>
int main()
{
double d1 = (0.1 + 0.2);
double d2 = 0.3;
printf("%.20e\n%.20e", d1, d2);
return 0;
}
выход:
3.00000000000000044409e-01
2.99999999999999988898e-01
(учтите, что вывод зависит от компилятора. В зависимости от параметров, 0.1 + 0.2
может быть скомпилирован и округлен до 0,3)