Как добиться округления средней точки от нуля в числовом поле в ExtJS?

Я имею дело с ExtJS 6.2.1. У меня есть числовое поле, и мне нужно ограничить его тремя цифрами после разделителя. Поэтому я использую свойство decimalPrecision:

{ xtype: 'numberfield', decimalPrecision: 3 }

Теперь кажется, что по умолчанию ExtJS использует округление средней точки до ближайшего четного числа: 1,2345 превращается в 1,234, а 1,2355 превращается в 1,236. Мне нужно изменить это поведение, чтобы округлить от нуля, чтобы 1,2345 превратилось в 1,235. Как я могу этого добиться? Спасибо.


person Илья Иваницкий    schedule 30.03.2020    source источник


Ответы (1)


Это действие происходит в частном fixPrecision.

        return parseFloat(Ext.Number.toFixed(parseFloat(value), precision));

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

Для исправления работы компонента предлагаю использовать следующее переопределение

Ext.define('Ext.form.field.NumberOverride', {
    override: 'Ext.form.field.Number',
    fixPrecision: function (value) {
        var me = this,
            nan = isNaN(value),
            precision = me.decimalPrecision;
        if (nan || !value) {
            return nan ? '' : value;
        } else if (!me.allowDecimals || precision <= 0) {
            precision = 0;
        }
        return (Math.round(value * (10 ** precision)) / (10 ** precision)).toFixed(precision);
    }
});

Fiddle

P.S. Эта тема помогла мне

person pvlt    schedule 30.03.2020
comment
Спасибо за ответ. Не пробовал, но вроде законно. Я решил свою проблему, установив decimalPrecision: 4 и добавив такой слушатель: listeners: { 'change': function(field, newValue, oldValue) { newValue = Math.round(newValue * 1000)/1000; поле.setValue (новое значение); } } - person Илья Иваницкий; 02.04.2020