uni-app uni-number-box组件 有时候按+号不进行步进

uni-app uni-number-box组件 有时候按+号不进行步进

开发环境 版本号 项目创建方式
Mac macOS 15.5 HBuilderX

示例代码:

如上所述

操作步骤:

如上所述

预期结果:

70.82 + 后 为 70.83

实际结果:

70.82 + 后 不变化

bug描述:

使用如下代码测试:

<uni-number-box v-model="form.price" :min="0.01" :max="100000" :step="0.01" :width="140"/>

你会发现当数字步进到70.82时,再按+号就不变化了, 同样的数字有70.96,也再按+号就不变化了,等等吧,没有一一测试,但是这两个数字是停住了。

同时还发现,当数值为70.82时,按减号-,发现直接到70.8,70.81去哪里了?


更多关于uni-app uni-number-box组件 有时候按+号不进行步进的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

其他端有问题吗?

更多关于uni-app uni-number-box组件 有时候按+号不进行步进的实战教程也可以访问 https://www.itying.com/category-93-b0.html


目前只使用app端,其它端没有测试

回复 守护: 麻烦发个可复现demo

回复 DCloud_UNI_JBB: 已添加复现附件

添加附件

看了下代码 发现是这个组件内把 value 转为了正整数 +1步进的 即this.inputValue scale 值为 70.82 100 刚好 值为70.82的时候 相乘后被变成了 7081.999999999999 此时+1 就变成了7082.999999999999 最后在输出时用了(Math.floor(7082.999999999999) / 100)把小数点后的截取掉了 结果又回到了 70.82 然后就选入了循环中 可以在代码中把 floor 改为 round 就可以正常步进了 但是不确定有没有其他的影响 可以等官方修复一下 把floor
this.inputValue = (Math.floor(value) / scale).toFixed(String(scale).length - 1);
改为round
this.inputValue = (Math.round(value) / scale).toFixed(String(scale).length - 1);

嗯,非常感谢,正如你所说。 已经改写了那个逻辑

这是一个典型的浮点数精度问题。由于JavaScript使用IEEE 754双精度浮点数表示数字,像0.01这样的十进制小数在二进制中无法精确表示,导致计算时出现精度误差。

在70.82这个节点,实际存储的值可能是70.82000000000001或70.81999999999999,当加上0.01时,可能因为精度问题导致结果没有达到预期的70.83,或者与当前值差异过小而被组件判定为无需更新。

同样,从70.82减到70.81时,由于精度误差,计算结果可能直接跳到了70.80。

解决方案:

  1. 使用整数运算:将数值乘以100,用整数进行步进计算,显示时再除以100
<uni-number-box v-model="form.price" :min="1" :max="10000000" :step="1"/>

在数据处理时进行转换。

  1. 使用toFixed()方法处理精度:
this.form.price = parseFloat((this.form.price + 0.01).toFixed(2))
回到顶部