в JavaScript типичном пути к раунду число к десятичным разрядам N - что-то как:
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));
Однако этот подход будет вокруг к максимуму десятичных разрядов N, в то время как я хочу всегда вокруг к десятичным разрядам N. Например, "2.0" был бы округлен к "2".
Какие-либо идеи?
Это не проблема округления, это проблема отображения. Число не содержит информации о значащих цифрах; значение 2 совпадает с 2.0000000000000. Когда вы превращаете округленное значение в строку, вы заставляете ее отображать определенное количество цифр.
Вы можете просто добавить нули после числа, например:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(Обратите внимание, что это предполагает, что региональные настройки клиента используют точку в качестве десятичного разделителя, код требует дополнительной работы для работы с другими настройками.)
Надеюсь, рабочий код (не много проверял):
function toFixed(value, precision) {
var precision = precision || 0,
neg = value < 0,
power = Math.pow(10, precision),
value = Math.round(value * power),
integral = String((neg ? Math.ceil : Math.floor)(value / power)),
fraction = String((neg ? -value : value) % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
return precision ? integral + '.' + padding + fraction : integral;
}
Вот ссылка на Javascript sprintf,
http://www.webtoolkit.info/javascript-sprintf.html
Вызов sprintf () - это одна из методологий округления в Perl, но {{1} } javascript изначально не имеет этой функции.
http://perldoc.perl.org/functions/sprintf.html
Помогает ли это?
Я нашел способ. Это код Кристофа с исправлением:
function toFixed(value, precision) {
var precision = precision || 0,
power = Math.pow(10, precision),
absValue = Math.abs(Math.round(value * power)),
result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));
if (precision > 0) {
var fraction = String(absValue % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
result += '.' + padding + fraction;
}
return result;
}
Читайте подробности о повторении символа с помощью конструктора массива здесь, если вам интересно, почему я добавил "+ 1".