Как округлить результат деления в межсистемном кеше?

Как лучше всего округлить результат деления в межсистемном кеше?

Спасибо.


person syonip    schedule 18.11.2015    source источник


Ответы (2)


Есть некоторые функции, которые раньше форматировали числа, а также округляли их при необходимости.

$justify(выражение,ширина[ ,decimal]) - Caché округляет или дополняет количество дробных цифр в выражении до этого значения.

write $justify(5/3,0,3)
1.667

$fnumber(число,формат, десятичная дробь)

write $fnumber(5/3,"",3)
1.667

$number(число,формат, мин Макс)

write $number(5/3,3)
1.667

$normalize(число,масштаб)

w $normalize(5/3,3)
1.667

Вы просто можете выбрать, какой из них намного больше подходит для вас. Они делают разные вещи, но результат может быть таким же.

person DAiMor    schedule 18.11.2015
comment
какой лучший способ получить только целочисленный результат? - person syonip; 18.11.2015
comment
Не уверен, что вы имеете в виду, но я думаю, что $fnumber — лучший - person DAiMor; 18.11.2015
comment
Я имею в виду, что в вашем примере я хочу получить 5/3 = 2 - person syonip; 19.11.2015
comment
$number(5/3,0) даст результат 2, а также $j(5/3,0,0) и $fn(5/3,,0) - person DAiMor; 19.11.2015

В стандартном MUMPS (с которым Cache Object Script обратно совместим) есть три связанных с «делением» оператора. Первый — это одиночный символ «/» (т. е. косая черта). Это реальное числовое деление. 5/2 равно 2,5, 10,5/5 равно 2,1 и т. д. Это принимает два числа (каждое из которых может включать десятичную точку и дробь) и возвращает число, возможно, с дробью. Полезно помнить, что это числовое деление дает настолько простые результаты, насколько это возможно. Если перед десятичной запятой стоят ведущие нули, например 0007, число будет рассматриваться как 7. Если после запятой есть замыкающие нули, они также будут обрезаны. Таким образом, 2.000 обрезается до 2 (обратите внимание на отсутствие десятичной точки), а 00060.0100 будет обрезано до 60.01.

В прошлом многие разработчики гарантировали, что 3/3 всегда будет равно 1 (а не 0,99999) и что математика будет выполнена настолько точно, насколько это возможно. Сейчас это не так важно, но раньше существовали специальные библиотеки для работы с двоично-десятичным кодом (BCD), чтобы гарантировать, насколько это возможно, что доли копейки никогда не будут генерироваться.

Следующим оператором деления был одиночный символ «\» (то есть обратная косая черта). некоторые люди называли этот оператор целочисленным делением или «div». Это сделает деление и выбросит любой остаток. Самое интересное в этом то, что результатом всегда будет целое число, но входные данные не обязательно должны быть целыми числами. Таким образом, 10\2 равно 5, но 23\2,3 равно 10, а также 23,3\2,33. Если осталась дробь, она просто отбрасывается. Так что 23,3\2,3 тоже 10. Полный оператор деления даст вам много дробей. 23.3/2.3 это 10.130434 и т.д.

Конечным оператором деления является остаток (или «mod» или «modulo»), обозначаемый одним символом «#» (иногда называемый решеткой, знаком фунта или октоторпом). Чтобы получить ответ для этого, вычисляется целочисленное деление «/», и результатом будет то, что останется после вычисления целочисленного деления. В нашем примере 23\2 ответ равен 11, а оставшееся значение равно 1, поэтому 23#2 равно 1 и 23.3#2.3 равно 0,3. Вы можете заметить, что (число#делитель)+((число\делитель)*делитель) всегда будет вашим первоначальным номером обратно.

Надеюсь, это поможет вам прояснить эту идею в вашем программировании.

person David Whitten    schedule 12.05.2016