これは、多くの値が浮動小数点 (単精度または倍精度) では正確に表現できないためですが、double ははるかに近いものを表すことができます。表示される小数点以下の桁数を増やして印刷すると、ほぼ確実にエラーが表示されます。
値 0.3 を正確に表すことはできません。さらに、計算の結果、オペランドからエラーが検出される場合があります。「0.3 * 10」は結果の誤差を拡大するため、正確には 3.0 にはなりません。
最良のアナログは、「1/3」を 10 進数で表示しようとすることです。0.333333 または 0.333333333333 と書くかもしれません。これらを 3 倍すると、0.999999 または 0.999999999999 になります。それらを電卓画面 (桁数が固定されている) に表示すると、1 つ目はエラーと共に表示され、2 つ目は切り上げられます。
編集:これを示すコード:
#include <stdio.h>
int main()
{
float f = 0.3;
double d = 0.3;
printf("%.50lf %.50lf\n", f, d);
printf("%.10lf %.10lf\n", f, d);
}
表示:
0.30000001192092895507812500000000000000000000000000 0.29999999999999998889776975374843459576368300000000
0.3000000119 0.3000000000