Как использовать двойной тип данных при умножении на значение Integer? - PullRequest
0 голосов
/ 29 июля 2011

У меня есть функция обрезания десятичных разрядов двойного типа данных vaiable, который указан ниже

             public double GetTruncate(double tobeTruncated, int divideFactor)
      {            
        if (divideFactor == 0)
            return Math.Truncate((double)tobeTruncated);
        else
        {
            tobeTruncated = tobeTruncated * divideFactor;
            tobeTruncated = Math.Truncate((double)tobeTruncated);
            tobeTruncated = tobeTruncated / divideFactor;
        }
        return tobeTruncated;


    }

Пример: tobeTruncated = 35,66 коэффициент деления = 100

При выполнении вышеупомянутой строки я получаю значение для tobeTruncated как 3565.9999999999995 вместо 3566 . Я не знаю причину.

Когда я изменил двойную переменную на десятичную, я получил правильный ответ . Модифицированная функция с правильным ответом приведена ниже:

           public double GetTruncate(double tobeTruncated, int divideFactor)
    {           

        decimal nTempData = (decimal)tobeTruncated;
        if (divideFactor == 0)
            return (double)Math.Truncate((decimal)nTempData);
        else
        {
            nTempData = nTempData * divideFactor;
            nTempData = Math.Truncate((decimal)nTempData);
            nTempData = nTempData / (decimal)divideFactor;
        }
        return (double)nTempData;

    }

Кто-нибудь может объяснить причину этого?

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Числа с плавающей запятой могут быть аппроксимированы только конечным количеством битов, которые ваш компьютер использует для их хранения.Результат - это то, что вы видите.

Чтение: Не сломано ли двойное умножение в .NET?

Чтение: Двоичная с плавающей запятой и .NET

И читать: Почему компьютеры сосут в математике?

1 голос
/ 29 июля 2011

В .NET тип данных десятичный представляет числа с фиксированной точностью. Тип данных double представляет числа с плавающей точкой, которые являются приблизительными, и s не следует использовать, когда требуется абсолютная точность .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...