数字取整或保留小数四舍五入的正确写法

【JS篇】

使用toFixed是错误的!请看下面例子:

(0.05).toFixed(1)    //0.1
(0.15).toFixed(1)    //0.1
(0.25).toFixed(1)    //0.3
(0.35).toFixed(1)    //0.3
(0.45).toFixed(1)    //0.5
(0.55).toFixed(1)    //0.6
(0.65).toFixed(1)    //0.7
(0.75).toFixed(1)    //0.8
(0.85).toFixed(1)    //0.8
(0.95).toFixed(1)    //0.9

与C#不同的是,js中的Math.round是可以正确显示四舍五入的整数的

Math.round(0.5)    //1
Math.round(1.5)    //2
Math.round(2.5)    //3
Math.round(3.5)    //4
Math.round(4.5)    //5
Math.round(5.5)    //6
Math.round(6.5)    //7
Math.round(7.5)    //8
Math.round(8.5)    //9
Math.round(9.5)    //10

所以在js中,正确的四舍五入应该这样写:

Math.round(0.05 * 10) / 10    //0.1
Math.round(0.15 * 10) / 10    //0.2
Math.round(0.25 * 10) / 10    //0.3
Math.round(0.35 * 10) / 10    //0.4
Math.round(0.45 * 10) / 10    //0.5
Math.round(0.55 * 10) / 10    //0.6
Math.round(0.65 * 10) / 10    //0.7
Math.round(0.75 * 10) / 10    //0.8
Math.round(0.85 * 10) / 10    //0.9
Math.round(0.95 * 10) / 10    //1

如果需要强制保留小数位数,再加上toFixed就可以了

(Math.round(0.95 * 10) / 10).toFixed(1)    //1.0

为了方便使用,封装一下:

//小数四舍五入,f精度范围[0,10]
Number.prototype.numberRound = function (f) {
    return NumberRound(this, f);
}
String.prototype.numberRound = function (f) {
    return NumberRound(this, f);
}
function NumberRound(n, f) {
    n = parseFloat(n);
    f = (f == "" || isNaN(f)) ? 0 : (f > 10 ? 10 : parseInt(f));var x = Math.pow(10, f);
    return Math.round(n * x) / x;
}

所以,这样用起来就更方便了:

(0.15).numberRound(1)        //0.2
"0.15".numberRound(1)        //0.2
"0.15".numberRound("")       //0      空,精度为0
"0.15".numberRound("abc")    //0      非数字,精度为0
"0.15".numberRound(10000)    //0.15   超出精度最大值,精度为10
    

如果非要保留位数,就再加一个toFixed就可以了

(0.095).numberRound(1).toFixed(2)    //0.10

【C#篇】

相比JS,疑似C#四舍五入的方法有很多,最广泛使用的Convert.ToInt32是错误的!请看下面例子:

Convert.ToInt32(0.5)    //0
Convert.ToInt32(1.5)    //2
Convert.ToInt32(2.5)    //2
Convert.ToInt32(3.5)    //4
Convert.ToInt32(4.5)    //5
Convert.ToInt32(5.5)    //6
Convert.ToInt32(6.5)    //6
Convert.ToInt32(7.5)    //8
Convert.ToInt32(8.5)    //8
Convert.ToInt32(9.5)    //10

那么,我们熟悉的Math.Round呢?竟然结果和上面完全一样!也是错误的。

好吧,那么再用ToString()试试:

(0.05).ToString("0.0")    //0.1
(0.15).ToString("0.0")    //0.2
(0.25).ToString("0.0")    //0.3
(0.35).ToString("0.0")    //0.4
(0.45).ToString("0.0")    //0.5
(0.55).ToString("0.0")    //0.6
(0.65).ToString("0.0")    //0.7
(0.75).ToString("0.0")    //0.8
(0.85).ToString("0.0")    //0.9
(0.95).ToString("0.0")    //1.0

很好,接着试ToString("#0.0")和ToString("f1")和ToString("g1"),也是一样的结果,都是正确的!

f1表示精度为1位,自动补0;g1表示精度为1位,不会补0,所以在C#中,四舍五入其实很简单,直接 ToString()就可以了:

(0.65).ToString("f1")        //0.7
(0.65).ToString("f3")        //0.650
(0.65).ToString("g3")        //0.65
时间: 2024-11-05 12:35:24

数字取整或保留小数四舍五入的正确写法的相关文章

取整、保留小数等数字处理方法

问题描述: 后台数据类型为decimal a,在前台页面中显示时需要显示为整数. 我的做法是Convert.ToInt32(a),这样做是强制把内容转换为整数,改变了数据本来的意义. 最终做法是Math.Round(a,0),将a的小数值舍入为指定精度. 先看Math.Round()方法,是将值舍入到最接近的整数或指定的小数位数. MSDN上可以看到有这些重载的方法. Math.Round(3.44, 1); //Returns 3.4. Math.Round(3.45, 1); //Retur

decimal模块 --数字的精度、保留小数位数、取整问题

开始之前需要注意一点是:精度值为数字的总位数,如:1.23, 精度值为3: 0.123,精度值也为3 1.更改默认精度值后,直接进行计算即可保留对应范围值 from decimal import getcontext,Decimal getcontext().prec = 3 #设置精度值为3 f = 12.23435521 #type(f) : float value = Decimal(str(f)) #value: Decimal('12.23435521') #或:value = Dec

【PHP】进一法取整、四舍五入取整、忽略小数等的取整数方法大全

PHP取整数函数常用的四种方法,下面收集了四个函数:经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已--主要是:ceil,floor,round,intval PHP取整数函数常用的四种方法,下面收集了四个函数: 经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已--主要是:ceil,floor,round,intval 一.ceil - 进一法取整 说明 float ceil ( float value ) 返回不小于 value 的下一个整数,value

关于数字取整、四舍五入

在做购物车中,涉及购物车小计 产品价格为有两位小数的浮点数,在购物车页面上从后台获取数据商品数量及商品价格,在js中做计算显示到页面 出现例如: 的情况. 解决:采用toFixed();方法进行处理. //异步加载购物车详情 $(function(){ html=""; $.ajax({ type:'POST', data:{uname:sessionStorage['loginName']}, url:'../data/cart_detail_page.php', success:f

PHP取整、四舍五入取整、向上取整、向下取整、小数截取

PHP取整数函数常用的四种方法: 1.直接取整,舍弃小数,保留整数:intval(): 2.四舍五入取整:round(): 3.向上取整,有小数就加1:ceil(): 4.向下取整:floor(). 一.intval-对变数转成整数型态 intval如果是字符型的会自动转换为0. 1 intval(3.14159); // 3 2 intval(3.64159); // 3 3 intval('ruesin'); //0 4 echo intval((0.1+0.7)*10);//7 特殊情况

JavaScript基础 Math.floor() 向下取整 小数部分不四舍五入了,有小数就舍去。小数再大,都舍

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

js 向上取整、向下取整、四舍五入

js 向上取整.向下取整.四舍五入 CreateTime--2018年4月14日11:31:21 Author:Marydon // 1.只保留整数部分(丢弃小数部分) parseInt(5.1234);// 5 // 2.向下取整(<= 该数值的最大整数)和parseInt()一样 Math.floor(5.1234);// 5 // 3.向上取整(有小数,整数就+1) Math.ceil(5.1234); // 4.四舍五入(小数部分) Math.round(5.1234);// 5 Mat

java取整和java四舍五入方法

1 import java.math.BigDecimal; 2 import java.text.DecimalFormat; 3 4 public class TestGetInt{ 5 public static void main(String[] args){ 6 double i=2, j=2.1, k=2.5, m=2.9; 7 System.out.println("舍掉小数取整:Math.floor(2)=" + (int)Math.floor(i)); 8 Syst

问题:oracle floor;结果:Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明

Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明 (2011-04-06 16:10:35) 转载▼ 标签: 谈 分类: 渐行渐远 FLOOR——对给定的数字取整数位 SQL> select floor(2345.67) from dual; FLOOR(2345.67) -------------- 2345 CEIL-- 返回大于或等于给出数字的最小整数 SQL> select ceil(3.1415927) from dual; CEIL(3.14