parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

MoKo 03.03.2013 04:37

Тут, к сожалению, дело не в парсере и не в OS X. Программа на C на любом x86 выведет то же самое. И две последние строки являются ключем к тому, почему так происходит.

#include "stdio.h"
int main(int argc, char *argv[]) {
double a=5611.075000;
double b=5611.0550;
printf("%.2f\n",a);
printf("%.2f\n",b);
printf("%.16f\n",a);
printf("%.16f\n",b);
}

Вывод:

5611.07
5611.06
5611.0749999999998181
5611.0550000000002910

Пара ссылок "на почитать":

http://www.perlmonks.org/?node_id=109360
http://bugs.python.org/issue5118

В качестве решения предлагается добавлять "маленькое число". Проблема в том, что величина этого epsilon зависит от размерности
используемых чисел. То есть если у вас в ходу числа до 1e9, а всего значащих чисел в double 15-16, то надо добавлять 0.000001
перед каждым преобразованием в строку...