Я очень плохо знаком с JavaScript (я пришел из Java) и пытаюсь провести некоторые финансовые расчеты с небольшими суммами денег.
Мой первоначальный вариант:
<script type="text/javascript">
var normBase = ("[price]").replace("$", "");
var salesBase = ("[saleprice]").replace("$", "");
var base;
if (salesBase != 0) {
base = salesBase;
} else {
base = normBase;
}
var per5 = (base - (base * 0.05));
var per7 = (base - (base * 0.07));
var per10 = (base - (base * 0.10));
var per15 = (base - (base * 0.15));
document.write
(
'5% Off: $' + (Math.ceil(per5 * 100) / 100).toFixed(2) + '<br/>' +
'7% Off: $' + (Math.ceil(per7 * 100) / 100).toFixed(2) + '<br/>' +
'10% Off: $' + (Math.ceil(per10 * 100) / 100).toFixed(2) + '<br/>' +
'15% Off: $' + (Math.ceil(per15 * 100) / 100).toFixed(2) + '<br/>'
);
</script>
Это сработало хорошо, за исключением того, что всегда округлялось (Math.ceil
). Math.floor
имеет ту же проблему, и Math.round
также не годится для поплавков.
В Java я бы полностью избежал использования поплавков с самого начала, однако в JavaScript, по-видимому, нет включения по умолчанию чего-то сопоставимого.
Проблема в том, что все упомянутые библиотеки либо сломаны, либо для другой цели. Библиотека jsfromhell.com/classes/bignumber
очень близка к тому, что мне нужно, однако у меня возникают причудливые проблемы с ее округлением и точностью... Независимо от того, на что я установил Round Type, кажется, что он решает сам по себе. Так, например, 3.7107 с точностью до 2 и круглым типом ROUND_HALF_UP
каким-то образом получается как 3.72, тогда как должно быть 3.71.
Я также попробовал библиотеку @JasonSmith BigDecimal (обработанный порт из Java BigDecimal), но, похоже, это для node.js, который я не могу запустить.
Как я могу сделать это, используя vanilla JavaScript (и быть надежным), или есть современная (упомянутая выше, которой уже все годы) библиотека, которую я могу использовать, которая поддерживается и не сломана?