Browse Source

fix: inputnumber plus calculate wrong cause by js precision (#2937)

YannLynn 6 months ago
parent
commit
27e7a6779a

+ 1 - 1
packages/semi-foundation/utils/number.ts

@@ -10,7 +10,7 @@ export function plus(num1: number, num2: number) {
     const num1Digits = (num1.toString().split('.')[1] || '').length;
     const num2Digits = (num2.toString().split('.')[1] || '').length;
     const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
-    return (num1 * baseNum + num2 * baseNum) / baseNum;
+    return (Math.round(num1 * baseNum + num2 * baseNum)) / baseNum;
 }
 
 export function minus(num1: number, num2: number) {

+ 8 - 0
packages/semi-ui/inputNumber/__test__/inputNumber.test.js

@@ -563,5 +563,13 @@ describe(`InputNumber`, () => {
         expect(inputNumber.find('input').instance().value).toBe('123,456.78人民币');
     });
 
+    it('fix 2936, test js precision related calculation', () => {
+        const inputNumber = mount(<InputNumber step={0.01} max={0.08} min={0.01} defaultValue={0.07} />);
+        const btns = inputNumber.find(`.${BASE_CLASS_PREFIX}-input-number-suffix-btns .${BASE_CLASS_PREFIX}-input-number-button`);
+        const addBtn = btns.first();
+        addBtn.simulate('mousedown', { button: numbers.MOUSE_BUTTON_LEFT });
+        expect(inputNumber.find('input').instance().value).toBe('0.08');
+    });
+
 });
  

+ 11 - 0
packages/semi-ui/inputNumber/_story/inputNumber.stories.jsx

@@ -969,3 +969,14 @@ export const TestInputNumber = () => {
   </div>
   )
 }
+
+
+export const Fix2936 = () => {
+  return (
+    <div style={{ width: 280 }}>
+        <label>点击增加按钮,值会变成 0.08 </label>
+        <InputNumber step={0.01} max={0.08} min={0.01} defaultValue={0.07} />
+        <br/><br/>
+    </div>
+  )
+}