Double.Parse теряет точность при преобразовании строки из 8 десятичных знаков - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь преобразовать «12345678.12345678» в удвоение, но Double.Parse меняет его на 12345678.123457.То же самое в случае, когда я использую десятичную вместо двойной

   decimal check = Decimal.Parse("12345678.12345678", NumberStyles.AllowDecimalPoint);//returns 12345678.123457
    double check1 = (Double)check; //returns 12345678.123457

Ответы [ 5 ]

4 голосов
/ 02 декабря 2011

Арифметика с плавающей точкой со значениями двойной точности по своей природе имеет конечную точность. Существует только 15-16 значащих десятичных цифр информации в значении двойной точности. Поведение, которое вы видите, вполне ожидаемо.

Значение ближайшей представимой двойной точности до 12345678.12345678 равно 12345678.1234567798674106597900390625, которое соответствует наблюдаемому вами поведению.

1 голос
/ 02 декабря 2011

Типы с плавающей запятой имеют только столько значащих цифр: 15 или 16 в случае System.Double (точное число зависит от значения).

Документация для System.Double охватывает это.

Прочтение Что должен знать каждый учёный об арифметике с плавающей запятой стоит того.

0 голосов
/ 02 декабря 2011

Просто быстрый тест дал мне правильное значение.double dt = double.Parse ("12345678.12345678");Console.WriteLine (dt.ToString ());

0 голосов
/ 02 декабря 2011

Если вы посмотрите на страницу для двойного типа данных, вы увидите, что точность составляет 15-16 цифр.Вы достигли предела точности типа.

Я полагаю, что десятичная дробь может быть тем, что вы ищете в этой ситуации.

0 голосов
/ 02 декабря 2011

Здесь происходит две вещи:

  1. A десятичное для двойного преобразования неточно / двойной тип имеет точность, которая плохо отображается на целые числа(хотя бы в десятичной системе)

  2. Двойной имеет десятичный предел 15-16 знаков

Ссылка для десятичного в двойное преобразование;

...