Я использую библиотеку BigNumber.js для высокоточных арифметических вычислений. Для обеспечения более высокой точности я использую метод toFixed объекта Bignumber следующим образом:
Код: Выделить всё
(new BigNumber(6000 )).minus(9006000).div(9006000).times(4503000 ).plus(4503000 ).toFixed()
Приведенный выше код дает результат как 2999.99999999999998275. Я попытался проверить результат этого вычисления на C#, используя тип данных decimal, поскольку decimal имеет более высокую точность, чем double, но результат был другим на детальном уровне.
Код: Выделить всё
decimal rg1 = 6000m;
decimal lastSavedRG1 = 9006000m;
decimal lastsavedrefinedgoalMonthly1 = 4503000m;
decimal cal1 = (lastsavedrefinedgoalMonthly1 + (lastsavedrefinedgoalMonthly1 * ((rg1 - lastSavedRG1) / lastSavedRG1)));
Это вычисление дает значения как 3000.0000000000000000000001. Есть идеи, почему такие различия?
Подробнее здесь:
https://stackoverflow.com/questions/647 ... ion-in-c-s