Forráskód Böngészése

feat: 引入bignumber.js解决js计算精度丢失的问题

lanjianrong 4 éve
szülő
commit
6dc8c71913

+ 1 - 0
package.json

@@ -195,6 +195,7 @@
     "@ant-design/icons": "^4.5.0",
     "antd": "^4.13.0",
     "axios": "^0.21.1",
+    "bignumber.js": "^9.0.1",
     "dayjs": "^1.9.6",
     "mobx": "^5.15.4",
     "mobx-react": "^6.1.7",

+ 7 - 3
src/pages/Contract/Content/Income/components/Tabs/Detail/index.tsx

@@ -5,6 +5,8 @@ import { dayjsFormat, formatMoney } from '@/utils/util'
 import { Tooltip } from 'antd'
 import React, { useMemo } from 'react'
 import styles from './index.module.scss'
+import { BigNumber } from "bignumber.js"
+
 interface DetailProps {
   contract: iContractState
   type: "income" | "expenditure"
@@ -13,10 +15,12 @@ const Detail:React.FC<DetailProps> = (props) => {
   const { contract, type } = props
   const type_name = type === ContractType.INCOME ? '回款' : '支付'
   const progress = useMemo(() => {
-    const i = parseFloat((parseFloat(type === ContractType.INCOME ? contract.returned : contract.paid) / parseFloat(contract.price)).toFixed(2))
-    const j: number = 1 - i
+    const i = new BigNumber(type === ContractType.INCOME ? contract.returned : contract.paid).dividedBy(contract.price).toFixed(2)
+    // const i = parseFloat((parseFloat(type === ContractType.INCOME ? contract.returned : contract.paid) / parseFloat()).toFixed(2))
+
+    const j = new BigNumber(1).minus(i)
     const k: number = parseFloat(contract.price) - parseFloat(type === ContractType.INCOME ? contract.returned : contract.paid)
-    return { returned: isNaN(i) ? '0%' : i * 100 + '%', unReturned: isNaN(j) ? '100%' : j * 100 + '%', unReturnedMoney: k }
+    return { returned: new BigNumber(i).multipliedBy(100) + '%', unReturned: new BigNumber(j).multipliedBy(100) + '%', unReturnedMoney: k }
   }, [ contract ])
   return contract.id ? (
     <div className={styles.detailTab}>