如何在ExtJS 6.2.1的NumberField中实现远离零的中点舍入?
解决ExtJS 6.2.1 NumberField舍入规则问题
你遇到的是ExtJS默认的银行家舍入(向最近偶数舍入)行为,这是Math.round()的原生特性,而NumberField的roundDecimal方法默认依赖它。要改成远离零的舍入(即常规四舍五入),只需要重写这个方法即可。
具体实现方式
方式一:自定义NumberField子类(推荐,可复用)
创建一个自定义的数字输入框类,重写roundDecimal方法替换舍入逻辑:
Ext.define('YourApp.field.RoundAwayFromZeroNumberField', { extend: 'Ext.form.field.Number', alias: 'widget.roundawaynumberfield', roundDecimal: function(value) { var precision = this.decimalPrecision; if (precision && Ext.isNumber(value)) { var pow = Math.pow(10, precision); // 核心逻辑:先处理绝对值,加0.5后取整,再还原符号实现远离零舍入 return Math.sign(value) * Math.floor(Math.abs(value) * pow + 0.5) / pow; } return value; } });
之后在你的表单中使用这个自定义组件:
{ xtype: 'roundawaynumberfield', decimalPrecision: 3, fieldLabel: '自定义舍入数字输入框' }
方式二:直接在单个组件中重写方法(快速测试)
如果只需要在某个特定的NumberField上修改,也可以直接在组件配置中override方法:
{ xtype: 'numberfield', decimalPrecision: 3, fieldLabel: '单个实例自定义舍入', roundDecimal: function(value) { var precision = this.decimalPrecision; if (precision && Ext.isNumber(value)) { var pow = Math.pow(10, precision); return Math.sign(value) * Math.floor(Math.abs(value) * pow + 0.5) / pow; } return value; } }
逻辑说明
- 原生
Math.round()会对中间值(如x.5)向最近的偶数舍入,这就是你看到1.2345变成1.234、1.2355变成1.236的原因。 - 我们的自定义逻辑:先将数值放大10^precision倍,加0.5后用
Math.floor()取整(正数场景下等同于四舍五入),再通过Math.sign()保留原符号,确保负数也遵循远离零的舍入(比如-1.2345会被舍入为-1.235)。
测试验证
- 输入
1.2345→ 会被舍入为1.235 - 输入
1.2355→ 会被舍入为1.236 - 输入
-1.2345→ 会被舍入为-1.235
内容的提问来源于stack exchange,提问作者Илья Иваницкий
相关产品推荐
相关产品推荐

