Функции 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/
Самый простой подход состоит в том, чтобы иметь два представления, которые можно переключать, чтобы указать, какой вид был выбран. Вот пример кода того, как это можно сделать, определенно не оптимизированный способ обработки представлений, а просто демонстрация того, как вы можете использовать UISegmentControl для переключения видимого представления:
- (IBAction)segmentSwitch:(id)sender {
UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;
if (selectedSegment == 0) {
//toggle the correct view to be visible
[firstView setHidden:NO];
[secondView setHidden:YES];
}
else{
//toggle the correct view to be visible
[firstView setHidden:YES];
[secondView setHidden:NO];
}
}
Вы, конечно, можете дополнительно изменить коэффициент кода, чтобы скрыть / показать правильный вид.
Одна из идей состоит в том, чтобы представление с сегментированными элементами управления имело представление контейнера, которое вы заполняете различными подпредставлениями (добавляйте как единственное подпредставление представления контейнера, когда сегменты переключаются). У вас даже могут быть отдельные контроллеры представления для этих подпредставлений, хотя вы должны пересылать важные методы, такие как «viewWillAppear» и «viewWillDisappear», если они вам нужны (и им нужно будет сообщить, под каким контроллером навигации они находятся).
Как правило, это работает очень хорошо, потому что вы можете разместить основное представление с контейнером в IB, а вложенные представления будут заполнять все пространство, которое позволяет им контейнер (убедитесь, что ваши маски автоматического изменения размера настроены правильно).
Арифметический сдвиг вправо сохранит знак при сдвиге числа со знаком :
11111111 (-1) will stay 11111111 (-1)
Напротив, Логический сдвиг вправо не сохранит знак:
11111111 (-1) will become 01111111 (127)
Ваш код явно выполняет арифметический сдвиг, поэтому знаковый бит ( MSB ) повторяется. Действия оператора (>>) зависят от деталей реализации платформы, которую вы используете. В большинстве случаев это арифметический сдвиг.
Также обратите внимание, что 11111111
может иметь два разных значения в зависимости от представления. Это также влияет на способ их сдвига.
11111111
представляет 255. Сдвиг вправо не сохранит знак, поскольку MSB не является битом знака. 11111111
представляет -1.