日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

js计算浮点数出现小数;解决js计算小数问题;js数组相加出现小数;

發(fā)布時(shí)間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js计算浮点数出现小数;解决js计算小数问题;js数组相加出现小数; 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原博1 原博2

方案1和方案2都是有效的

情景: 在計(jì)算浮點(diǎn)數(shù)時(shí)候,出現(xiàn)多余小數(shù)。
例如: 1.11 + 1 = 2.1100000000000003

為什么計(jì)算小數(shù)會(huì)出現(xiàn)誤差?
浮點(diǎn)數(shù)值的最高進(jìn)度是17位小數(shù),但在進(jìn)行運(yùn)算的時(shí)候其精確度卻遠(yuǎn)遠(yuǎn)不如整數(shù);整數(shù)在進(jìn)行運(yùn)算的時(shí)候都會(huì)轉(zhuǎn)成10進(jìn)制; 而Java和JavaScript中計(jì)算小數(shù)運(yùn)算時(shí),都會(huì)先將十進(jìn)制的小數(shù)換算到對(duì)應(yīng)的二進(jìn)制,一部分小數(shù)并不能完整的換算為二進(jìn)制,這里就出現(xiàn)了第一次的誤差。待小數(shù)都換算為二進(jìn)制后,再進(jìn)行二進(jìn)制間的運(yùn)算,得到二進(jìn)制結(jié)果。然后再將二進(jìn)制結(jié)果換算為十進(jìn)制,這里通常會(huì)出現(xiàn)第二次的誤差。

方案1:簡(jiǎn)單的js加法和減法:

//加法 Math.round((parseFloat(num1) + parseFloat(num2))*100)/100 //減法 Math.round((parseFloat(num1) - parseFloat(num2))*100)/100

方案2:復(fù)雜的加減乘除運(yùn)算封裝:

以下代碼可以直接復(fù)制使用

有效的話請(qǐng)點(diǎn)贊評(píng)論下,讓更多的朋友能夠看到解決問題!

<template><div style="padding:20px;"><div><span>1.11 + 1 = {{ 1.11 + 1 }}</span> <span>-----處理浮點(diǎn)計(jì)算:{{ addNum }}</span></div><div><span>1.11 - 1 = {{ 1.11 - 1 }}</span> <span>-----處理浮點(diǎn)計(jì)算:{{ subNum }}</span></div><div><span>1.11 * 100= {{ 1.11 * 100 }}</span> <span>-----處理浮點(diǎn)計(jì)算:{{ mulNum }}</span></div><div><span>0.11 / 0.1 = {{ 0.11 / 0.1 }}</span> <span>-----處理浮點(diǎn)計(jì)算:{{ divNum }}</span></div><div><span> (((1.11 + 1) - 1) * 100) / 0.1 = {{ (((1.11 + 1) - 1) * 100) / 0.1 }}</span> <span>-----處理浮點(diǎn)計(jì)算:{{ lastNum }}</span></div></div> </template><script>export default {data () {return {addNum: 0,subNum: 0,mulNum: 0,divNum: 0,lastNum: 0}},created () {this.getNum()},methods: {getNum () {console.log(1.11 + 1)console.log(1.11 - 1)console.log(1.11 * 100)console.log(0.11 / 0.1)console.log((((1.11 + 1) - 1) * 100) / 0.1)this.addNum = this.floatObj().add(1.11, 1)// 加法this.subNum = this.floatObj().subtract(1.11, 1)// 減法this.mulNum = this.floatObj().multiply(1.11, 100)// 乘法this.divNum = this.floatObj().divide(0.11, 0.1)// 除法this.lastNum = this.floatObj().divide(this.floatObj().multiply(this.floatObj().subtract(this.floatObj().add(1.11, 1), 1), 100), 0.1)// 混合運(yùn)算},/** * 封裝了加減乘除四種計(jì)算方法 *** add / subtract / multiply /divide* this.floatObj().add(1.11, 1)// 加法* this.floatObj().subtract(1.11, 1)// 減法* this.floatObj().multiply(1.11, 100)// 乘法* this.floatObj().divide(0.11, 0.1)// 除法*/floatObj () {// 判斷obj是否為一個(gè)整數(shù)function isInteger (obj) {return Math.floor(obj) === obj}/** 將一個(gè)浮點(diǎn)數(shù)轉(zhuǎn)成整數(shù),返回整數(shù)和倍數(shù)。如 3.14 >> 314,倍數(shù)是 100* @param floatNum {number} 小數(shù)* @return {object}* {times:100, num: 314}*/function toInteger (floatNum) {var ret = { times: 1, num: 0 }if (isInteger(floatNum)) {ret.num = floatNumreturn ret}var strfi = floatNum + ''var dotPos = strfi.indexOf('.')var len = strfi.substr(dotPos + 1).lengthvar times = Math.pow(10, len)var intNum = Number(floatNum.toString().replace('.', ''))ret.times = timesret.num = intNumreturn ret}/** 核心方法,實(shí)現(xiàn)加減乘除運(yùn)算,確保不丟失精度* 思路:把小數(shù)放大為整數(shù)(乘),進(jìn)行算術(shù)運(yùn)算,再縮小為小數(shù)(除)** @param a {number} 運(yùn)算數(shù)1* @param b {number} 運(yùn)算數(shù)2* @param op {string} 運(yùn)算類型,有加減乘除(add/subtract/multiply/divide)**/function operation (a, b, op) {var o1 = toInteger(a)var o2 = toInteger(b)var n1 = o1.numvar n2 = o2.numvar t1 = o1.timesvar t2 = o2.timesvar max = t1 > t2 ? t1 : t2var result = nullswitch (op) {case 'add':if (t1 === t2) { // 兩個(gè)小數(shù)位數(shù)相同result = n1 + n2} else if (t1 > t2) { // o1 小數(shù)位 大于 o2result = n1 + n2 * (t1 / t2)} else { // o1 小數(shù)位 小于 o2result = n1 * (t2 / t1) + n2}return result / maxcase 'subtract':if (t1 === t2) {result = n1 - n2} else if (t1 > t2) {result = n1 - n2 * (t1 / t2)} else {result = n1 * (t2 / t1) - n2}return result / maxcase 'multiply':result = (n1 * n2) / (t1 * t2)return resultcase 'divide':result = (n1 / n2) * (t2 / t1)return result}}// 加減乘除的四個(gè)接口function add (a, b) { // 加法return operation(a, b, 'add')}function subtract (a, b) { // 減法return operation(a, b, 'subtract')}function multiply (a, b) { // 乘法return operation(a, b, 'multiply')}function divide (a, b) { // 除法return operation(a, b, 'divide')}return {add: add,subtract: subtract,multiply: multiply,divide: divide}}} } </script><style> </style>

有效的話請(qǐng)點(diǎn)贊評(píng)論下,讓更多的朋友能夠看到解決問題!

總結(jié)

以上是生活随笔為你收集整理的js计算浮点数出现小数;解决js计算小数问题;js数组相加出现小数;的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。