«Но я не уверен, что он подразумевает, выполнив мою собственную версию TextView?»
Он означает, что вы можете расширить класс android.widget.TextView (или Canvas или какой-либо другой визуализируемой поверхности) и реализовать свою собственную переопределяющую версию, которая позволяет встроенным изображениям с текстом, текущим вокруг них.
Это может быть довольно много работы в зависимости от того, насколько вы это делаете.
ПРИМЕЧАНИЕ. - См. Редактирование 4, если важна трехзначная точность.
var discount = (price / listprice).toFixed(2);
toFixed будет округлять вас вверх или вниз в зависимости от значений, превышающих 2 знака после запятой.
Пример: http://jsfiddle.net/calder12/tv9HY/
Документация: https://developer.mozilla.org/en-US/docs/ Web / JavaScript / Reference / Global_Objects / Number / toFixed
Редактировать - Как упоминалось другими, это преобразует результат в строку. Чтобы избежать этого:
var discount = +((price / listprice).toFixed(2));
Редактировать 2 - Как также упоминалось в комментариях, эта функция не работает с некоторой точностью, например, в случае 1,005 она вернет 1,00 вместо 1,01. Если важна точность в этой степени, я нашел ответ: https://stackoverflow.com/a/32605063/1726511 Кажется, что он хорошо работает со всеми тестами, которые я пробовал.
Однако требуется одно небольшое изменение: функция в ответе, связанном выше, возвращает целые числа, когда округляет до единицы, поэтому, например, 99.004 вернет 99 вместо 99.00, что не идеально для отображения цен.
Редактировать 3 - Похоже, что toFixed на фактическом возврате все еще испортил некоторые числа, это окончательное редактирование работает. Черт возьми, так много переделок!
var discount = roundTo((price / listprice), 2);
function roundTo(n, digits) {
if (digits === undefined) {
digits = 0;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
var test =(Math.round(n) / multiplicator);
return +(test.toFixed(digits));
}
См. Пример Fiddle здесь: https://jsfiddle.net/calder12/3Lbhfy5s/
Редактировать 4 - Вы, ребята, убиваете меня. Редактировать 3 не удается на отрицательных числах, не разбираясь в том, почему просто проще справиться с превращением отрицательного числа в положительное, прежде чем выполнять округление, а затем повернуть его обратно, прежде чем вернуть результат.
function roundTo(n, digits) {
var negative = false;
if (digits === undefined) {
digits = 0;
}
if( n < 0) {
negative = true;
n = n * -1;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
n = (Math.round(n) / multiplicator).toFixed(2);
if( negative ) {
n = (n * -1).toFixed(2);
}
return n;
}
Скрипка: https://jsfiddle.net/3Lbhfy5s/79/
Если вы используете унарный плюс для преобразования строки в число , как описано в MDN .
Например: +discount.toFixed(2)
Чтобы получить результат с двумя десятичными знаками, вы можете сделать это следующим образом:
var discount = Math.round((100 - (price / listprice) * 100) * 100) / 100;
Округляемое значение умножается на 100, чтобы сохранить первые две цифры, затем мы делим на 100, чтобы получить фактический результат.
Лучшее и простое решение, которое я нашел, это
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
round(1.005, 2); // 1.01
Я думаю, что лучший способ, которым я видел, это умножить на 10 на степень числа цифр, затем сделать Math.round, затем, наконец, разделить на 10 на степень цифры. Вот простая функция, которую я использую в машинописи:
function roundToXDigits(value: number, digits: number) {
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
Или простой javascript:
function roundToXDigits(value, digits) {
if(!digits){
digits = 2;
}
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
попробуйте использовать discount.toFixed(2);
Самый быстрый путь - быстрее, чем исправлено ():
x = .123456
result = Math.round(x * 100) / 100 // result .12
<час> x = .123456
result = Math.round(x * 1000) / 1000 // result .123
function round(num,dec)
{
num = Math.round(num+'e'+dec)
return Number(num+'e-'+dec)
}
//Round to a decimal of your choosing:
round(1.3453,2)
Функции Math.round () и .toFixed () предназначены для округления до ближайшего целого числа. Вы получите неверные результаты при работе с десятичными знаками и использовании метода «умножить и разделить» для Math.round () или параметра для .toFixed (). Например, если вы попытаетесь округлить 1,005, используя Math.round (1.005 * 100) / 100, вы получите результат 1, а 1,00 - .toFixed (2) вместо того, чтобы получить правильный ответ 1,01.
Вы можете использовать следующее для решения этой проблемы:
Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');
Добавьте .toFixed (2), чтобы получить два десятичных знака, которые вы хотели.
Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2').toFixed(2);
Вы можете создать функцию, которая будет обрабатывать округление для вас:
function round(value, decimals) {
return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}
Пример: https://jsfiddle.net/k5tpq3pd/36/
Альтернатива
Вы можете добавить функцию округления к числу, используя прототип. Я бы не советовал добавлять здесь .toFixed (), так как он возвращает строку вместо числа.
Number.prototype.round = function(decimals) {
return Number((Math.round(this + "e" + decimals) + "e-" + decimals));
}
и используйте его так:
var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals
Пример https://jsfiddle.net/k5tpq3pd/35/
Источник: http://www.jacklmoore.com/notes/rounding-in-javascript/
Для обработки округления до любого количества десятичных разрядов для большинства нужд будет достаточно функции с двумя строками кода. Вот пример кода для игры.
var testNum = 134.9567654;
var decPl = 2;
var testRes = roundDec(testNum,decPl);
alert (testNum + ' rounded to ' + decPl + ' decimal places is ' + testRes);
function roundDec(nbr,dec_places){
var mult = Math.pow(10,dec_places);
return Math.round(nbr * mult) / mult;
}
Небольшое отклонение от принятого ответа. toFixed(2)
возвращает строку, и вы всегда получите два десятичных знака. Это могут быть нули. Если вы хотите подавить последние нули, просто сделайте это:
var discount = + ((price / listprice).toFixed(2));
Отредактировано: я только что обнаружил ошибку в Firefox 35.0.1, что означает, что приведенное выше может дать NaN с некоторыми значениями.
Я изменил свой код на
var discount = Math.round(price / listprice * 100) / 100;
Это дает число с точностью до двух десятичных знаков. Если бы вы хотели три, вы бы умножили и поделили на 1000 и т. Д.
ОП всегда хочет два знака после запятой, но если toFixed () не работает в Firefox, он должен сначала исправить.
См. https://bugzilla.mozilla.org/show_bug.cgi?id=1134388
Вот рабочий пример
var value=200.2365455;
result=Math.round(value*100)/100 //result will be 200.24
function discoverOriginalPrice(discountedPrice, salePercentage) {
var originalPrice = discountedPrice / (1 - (salePercentage * .01));
return +originalPrice.toFixed(2);
}