11

или 1.85 - 1 = 0.8500000000000001.

А числа больше двух уже имеют только два знака после запятой

2.65 - 1 = 1,65
2.85 - 1 = 1,85
khex
  • 335
  • @Fike спасибо, только я сначала испугался что на floating-point-gui.de только на немецком – khex Jun 16 '14 at 09:52
  • Там не объяснено про числа больше двух. – knes Jun 16 '14 at 09:52
  • @knes It’s not stupid, just different – khex Jun 16 '14 at 09:55
  • это про 0,5 и 0,3.

    Хотя...

    1.65 - 1

    0.6499999999999999

    2.65 - 1

    1.65

    2.13 - 1

    1.13

    2.131 - 1

    1.1309999999999998

    20.131 - 1

    19.131

    Гм. Ну да, прально. У двойки лишний разряд появляется, чтобы эту фигню отобразить.

    – knes Jun 16 '14 at 09:59
  • 1
    Это особенность хранения чисел с плавающей запятой в двоичном виде. Сбой в точности происходит если число не раскладывается на сумму степеней двойки. – copist Jun 16 '14 at 10:00
  • В общем. Юзаем принудительное округление. – knes Jun 16 '14 at 10:00

1 Answers1

8

Basic Answers

  • Why don’t my numbers, like 0.1 + 0.2 add up to a nice round 0.3, and instead I get a weird result like 0.30000000000000004?
  • Why do computers use such a stupid system?
  • What can I do to avoid this problem?
  • Why do other calculations like 0.1 + 0.4 work correctly?
Deleted
  • 371
etki
  • 36,151
  • @Fike тогда только так Math.round((1.65 - 1) * 100) / 100 ? – khex Jun 16 '14 at 10:07
  • 1
    Лучше
    function rnd(num,signs){
      signs = Math.pow(10,Math.round(signs));
      return Math.round(num*signs)/signs;
    }
    
    

    чтобы не было хардкода.

    – knes Jun 16 '14 at 10:47
  • @Etki, ответ ссылка! – Visman Oct 22 '15 at 05:14
  • @Visman сейчас физически по времени не смогу переписать с полной теоретической выкладкой. – etki Oct 22 '15 at 11:03