Рассмотрим число с плавающей запятой 0.644696875. Давайте преобразуем его в строку с восемью десятичными знаками, используя Java и C:
Java
import java.lang.Math;
public class RoundExample{
public static void main(String[] args){
System.out.println(String.format("%10.8f",0.644696875));
}
}
результат: 0.6446968 8
Попробуйте сами: http://tpcg.io/oszC0w
C
#include <stdio.h>
int main()
{
printf("%10.8f", 0.644696875); //double to string
return 0;
}
результат: 0.6446968 7
Попробуйте сами: http://tpcg.io/fQqSRF
Вопрос
Почему последняя цифра отличается?
Фон
Номер 0.644696875 не может быть представлен точно как номер машины. Он представлен как дробь 2903456606016923/4503599627370496, которая имеет значение 0,6446968749999999
Это по общему признанию крайний случай. Но мне действительно любопытно узнать источник различий.
Связанный: https://mathematica.stackexchange.com/info/204359/is-numberform-double-rounding-numbers