none
Ошибка вычисления RRS feed

  • Вопрос

  • Доброго времени суток.

    Возможно вопрос глупый, но все же. Почему Single tmp = 9.0f * 0.1f; (в коде именно так) в tmp получается значение не 0.9, а 0.900000036 ? Откуда этот прирост. Причем с Single это у меня не первый раз, то он отнимает кусок, то прибавляет. Подскажите, чем вылечить (Math.Round и производные от него не подходят) ? Или же мне самому нужно вылечиться ?

    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:21 MSDN Forums consolidation (От:Visual C#)
    12 сентября 2010 г. 6:14

Ответы

  • Вобще-то в определении типа float четко говорится о точности представления в 7 десятичных знаков, а вы что-то многовато взяли.

    А  неточность возникает в связи с приближенной аппроксимацией десятичных чисел двоичными. Конечное десятичноя дробное число 0.9  представляется как бесконечная двоичная дробь 0.11100110011001100.... Эта двоичная дробь округляется в компьютере и получается не совсем 0.9

    • Помечено в качестве ответа SkiF-1 12 сентября 2010 г. 7:02
    12 сентября 2010 г. 6:48

Все ответы

  • Вобще-то в определении типа float четко говорится о точности представления в 7 десятичных знаков, а вы что-то многовато взяли.

    А  неточность возникает в связи с приближенной аппроксимацией десятичных чисел двоичными. Конечное десятичноя дробное число 0.9  представляется как бесконечная двоичная дробь 0.11100110011001100.... Эта двоичная дробь округляется в компьютере и получается не совсем 0.9

    • Помечено в качестве ответа SkiF-1 12 сентября 2010 г. 7:02
    12 сентября 2010 г. 6:48
  • Ну насчет 7 знаков я знаю, но брал (скопировал значение) исключительно из результата вычисления в Break Point, т.е. не саморучно набирал цифры.

    А насчет объяснения, спасибо. Теперь буду знать.

    12 сентября 2010 г. 7:01