js实现小数点四舍五入

news/2024/7/5 20:42:27

js实现小数点四舍五入

其实这个问题,在之前的面试中被提问到了,由于笔者平时都是用原生的toFixed()的方法来保留小数点,所以当时并没有回答出来这个问题,呜呜呜~.~ ?
现在突然想起了这个问题,就研究一下吧。

最简单的实现方法

可以使用Math对象的一些方法来实现,这个比较简单,主要用到了Math.round和一些简单的乘除法运算。例子
思路:
1. 先把数值转成只有一位小数点的数值
2. 利用Math.round方法四舍五入(关键)
3. 最后通过乘除法运算等到想要的小数点位数


function toFixed(num,decimal){
    if(isNaN(num)){
        return 0;
    }
    num = num-0;
    var p1 = Math.pow(10, decimal + 1);
    var p2 = Math.pow(10, decimal);
    console.log(num * p1 / 10);
    console.log(Math.round(num * p1 / 10));
    return (Math.round(num * p1 / 10) / p2).toFixed(decimal); //思考一下,为什么要除10?
}

运行一下上面的代码,其实有隐藏的bug... ?


toFixed(2.555,2) //2.56

toFixed(4100.065,2) //4100.06 ???

console.log(4100065/10) //410006.49999999994  这就是bug的答案

0.1+0.2=? //0.30000000000000004

所谓的隐藏bug,就是js编程语言的小数点精度问题,所以上面那个除于10 只是在一定的范围内有效,过了这个范围,还是会出现精度问题...

用字符串处理

既然小数点进行运算会出现问题,那我们换一种思路,用字符串来处理。例子 ?
思路:
1. 把数字转成字符串,然后把小数点移动到倒数第二位。(模拟只有一位小数点)
2. 还是用到Math.round来四舍五入
3. 重复第一个步骤,不过把小数点移动到(你要保留多少位小数点)


function toFixed(num,decimal){
    if(isNaN(num)){
        return 0;
    }
    var strnum = num+'';
    var arr = strnum.split('.');
    if(arr.length<2){
        return num.toFixed(decimal);
    }

    strnum = arr.join('');

    var strnum2 = strnum.slice(0,-1)+'.'+strnum.slice(-1);

    var result = Math.round(strnum2-0)+'';

    return result.slice(0,-decimal)+'.'+result.slice(-decimal)
}

转载于:https://www.cnblogs.com/blogs-xlf/p/11113703.html


http://www.niftyadmin.cn/n/3842933.html

相关文章

CTE表达式递归

/*通用表表达式 CTE的递归*/ --1.CTE有一个优点就是可以允许自身引用&#xff0c;这样可以方便创建递归的CTE --递归CTE的结构包括&#xff1a;定位点成员和递归成员&#xff0c;递归的过程就是Ti作为输入&#xff0c;Ti1作为输出。 --创建测试数据 create table test( id varc…

Selenium(Java)-显式等待和隐式等待

https://blog.csdn.net/yanhongyu315/article/details/80701005 在自动化测试中&#xff0c;有时你需要等待一个任务结束后才能进行下一个任务&#xff0c;所以两个任务之间就需要间隔一段等待时间&#xff0c;而Selenium提供了两种方法&#xff0c;在我们编写自动化测试代码时…

Windows图标:有一些你未必知道的东西

有一天&#xff0c;我的程序在任务栏的应用程序中看起来是这样的很奇怪&#xff0c;我的图标明明不是这样的&#xff0c;在资源管理器的文件夹里面&#xff0c;我的图标能够正常显示&#xff0c;在桌面的任务栏里&#xff0c;也能正常的显示&#xff0c;唯独在任务管理器里显示…

工具篇-Java中的设计模式积累(二)

------------------------------------------行为型设计模式 1. 模版模式 为什么有模版模式&#xff1a; 定义一个算法的骨架&#xff0c;而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法中某些步骤的具体实现&#xf…

64位2003与ASP.NET 1.1

去客户现场布署系统。 服务器是64位的2003&#xff0c;可系统是.net 1.1的&#xff0c; 新建网站后&#xff0c;网站的ASP.NET版本里面没有1.1的选项。 安装并注册.net 1.1后&#xff0c;网站属性里没有ASP.NET的选项了。 服务器上以前的一个2.0的网站和这个新系统都可以运行。…

fatal: remote origin already exists.

解决方法: 先删除, 再添加 1. git remote rm origin 2. git remote add origin https://github.com/zjulanjian/eshop.git 3. git push -u origin master转载于:https://www.cnblogs.com/zjulanjian/p/11118915.html

C语言实验作业9

实验目的&#xff1a;1、掌握二维数组的使用方法。 2、掌握用二维数组表示杨辉三角的方法。 实验题目&#xff1a;输出杨辉三角。 实验代码&#xff1a; /*杨辉三角*/#include<stdio.h>int main(){ int i,j,n; int a[100][100]; printf("输入n行:"); /*输入杨辉…

python 进程池2 - Pool相关函数

python自2.6开始提供了多进程模块multiprocessing&#xff0c;进程池使用multiprocessing.pool&#xff0c;pool的构造如下&#xff1a; multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) processes表示pool中进程的数目&#xff0c;默认地…