Участник сообщества #154
Участник сообщества #154
30 сент. 2025 г., 12:06(изменён)
Решено
0
0

Проблема округления чисел с плавающей запятой в WebSoft HCM

Из чата сообщества

Всем привет, кто-нибудь из разрабов WS может объяснить такое поведение?

photo_2416@30-09-2025_15-06-42.jpg
Участник сообщества
Участник сообщества1 окт. 2025 г., 06:37(изменён)
Решение

Как костыль, наверно такой вариант подойдёт

function roundToDigit(num, digit) {
    var multiplier = 1 / digit;
    return Math.round(num * multiplier) / multiplier;
}

alert(roundToDigit(8.35,0.1))
alert(roundToDigit(8.345,0.01))
Участник сообщества
Участник сообщества30 сент. 2025 г., 12:12(изменён)

мб округляет?

Участник сообщества
Участник сообщества30 сент. 2025 г., 12:14(изменён)

Я для этих целей всегда StrRealFixed использую Проверил на вашем примере - корректно работает

strrealfixed тоже самое выдает

причем это скорее всего ошибка при вычислении с плавающей запятой, т.к. StrReal(8.55, 1) выдает правильно значение = 8.6

хм точно а если на сервере агент?

аналогично

Участник сообщества
Участник сообщества30 сент. 2025 г., 12:20(изменён)

Хоть и не разраб WS, но обычный JS выдаёт аналогичный результат при использовании .toFixed

photo_2417@30-09-2025_15-20-03.jpg
Участник сообщества
Участник сообщества30 сент. 2025 г., 12:21(изменён)

веб-админка, или на сервере/десктопе?

везде

Участник сообщества
Участник сообщества30 сент. 2025 г., 12:23(изменён)

тема гуглится как особенности округления чисел с плавающей точкой

Участник сообщества
Участник сообщества30 сент. 2025 г., 12:23(изменён)

Поэтому на обычном js юзаю Intl.NumberFormat

Участник сообщества
Участник сообщества30 сент. 2025 г., 13:23(изменён)

в js есть Math.floor, Math.ceil, Math.round fround, f16round

Участник сообщества
Участник сообщества30 сент. 2025 г., 15:19(изменён)

А какая тут магия. В сишном коде sprintf, в браузере - toFixed. А как они сработают - так и сработают. Почему в WS должно быть по другому - ХЗ...

Участник сообщества
Участник сообщества30 сент. 2025 г., 15:27(изменён)

Ну тогда как правильно округлять?

Хорошо, не будем Понять бы какую функцию правильно было применить здесь, чтобы 8.4 и 8.35 получить Мы ж без наезда, Андрей Заказчикам же не объяснишь про правила математики, когда например в результате процедуры оценки кто-то премию не получил

Участник сообщества
Участник сообщества30 сент. 2025 г., 15:29(изменён)

дак вам же скажут (например, я): дак это же не тот js. Где тогда другие функции оттуда?))

Участник сообщества
Участник сообщества1 окт. 2025 г., 07:14(изменён)

пока ограничились малым костылем StrReal(num + 0.00001, 1)

но есть побочка - течет кровь из глаз

А вот это что ли не рабочая схема? Должно же вроде.

Участник сообщества
Участник сообщества1 окт. 2025 г., 09:03(изменён)

А в других языках все хорошо?

нет. ведь эта проблема с плавающей точкой не на уровне языка, а эвм в целом

ну в шарпах при округлении я такого не встречал

Math.Round вроде тоже имеет конфиги для уточнения < 5 >

Чтобы ответить, необходимо войти в систему