javaScript округление десятичных дробей с помощью toFixed - PullRequest
2 голосов
/ 26 апреля 2020

Я столкнулся с проблемой округления десятичных знаков в JavaScript с использованием toFixed.

const num1 = (100.555).toFixed(2) // "100.56"
const num2 = (10.555).toFixed(2) // "10.55"

Кто-нибудь может объяснить, почему происходит такое поведение? Почему первый пример округляет десятичные дроби до 56, а второй - 55?

Обновление: если я добавлю 4 десятичных знака, округление будет другим.

const num3 = (10.5555).toFixed(2) // "10.56"

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Это из-за проблемы точности в плавающих числах .... Вы можете найти библиотеки для вычисления точности для npm как "npm install bigdecimal" Ссылка здесь: Ссылка BigDecimal

var x = new bigdecimal.BigDecimal("123456.123456789012345678901234567890");

и вы можете использовать его так, чтобы все было хорошо .....

Надеюсь, это несколько прояснит вашу проблему .... мир

0 голосов
/ 26 апреля 2020

Это должно решить вашу проблему

// its a rounding bug it can be compenstated by representing numbers exactly in decimal notation.

Number.prototype.toFixedDown = function(digits) {
    var re = new RegExp("(\\d+\\.\\d{" + digits + "})(\\d)"),
        m = this.toString().match(re);
    return m ? parseFloat(m[1]) : this.valueOf();
};

const num1 = 100.555.toFixedDown(2) 
const num2 = (10.555).toFixedDown(2) 

alert(num1+ ' ' + num2);
...