解决四舍五入的一种很巧妙的方法

此前,我一般用某数据减去他的整数部分的结果与0.5,进行比较,来判断舍或是入。代码如下:



//输出浮点数a四舍五入之后的结果

int main()
{
    float a;
    cin>>a;
    if(a-(int)a)<0.5;
        cout<<(int)a;
    else 
        cout<<(int)a+1;
    return 0;
}

这样少许麻烦,会用到一个if条件句。更为简便的方法是,直接在原浮点数的基础上加上0.5,再取其小数部分。因为若是整数部分小于0.5,加上0.5之后小数部分小于1,这时其整数部分刚好就是舍了之后的结果;若是整数部分大于0.5,加上0.5后整数部分就是入了之后的结果。代码如下:

//请输出浮点数a四舍五入之后的值
int main()
{
    float a;
    int b=a+0.5;
    cout<< b;
    return 0;
}

此外,练题的时候遇到一种四舍五入求百分数的题

//及格人数为a,总人数为n,求及格率,并四舍五入以百分数的形式输出,百分号前的数为整数
int main()
{
    float b=(a*1.0)/(n*1.0);//b为及格率的小数形式.分子分母有一项*1.0就可
    int per;
    per=(int)((b+0.005)*100);//b+0.005相当于四舍五入前百分号形式的及格率中,百分号前面的数加了0.5,在对其取整数部分
    //这里也可以不写(int),因为per本身就是int类型
    //也可以向上面所说的那样,写作per=b*100+0.5;
    cout<<per<<"%";
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
toFixed方法是用来将一个数字保留指定位数的小数的方法。它返回的是一个字符串形式的结果,并且如果不够指定的位数,会使用0进行补齐。然而,toFixed方法并不是以四舍五入的方式进行取舍的,而是使用银行家舍入法进行取舍的。银行家舍入法是一种四舍六入五取偶的方法。具体规则如下: - 当舍去位的数值小于5时,直接舍去。 - 当舍去位的数值大于等于6时,在舍去的同时向前进一位。 - 当舍去位的数值等于5时: - 如果5后不为空且不全为0,则在舍去的同时向前进一位。 - 如果5后为空或全为0: - 如果5前的数值为奇数,则在舍去的同时向前进一位。 - 如果5前的数值为偶数,则直接舍去。 然而,有人发现使用toFixed方法时,遇到取舍位置为5的情况时会出现问题。例如,89.115.toFixed(2)会得到89.11而不是89.12。这是因为toFixed方法在遇到5时会出现问题。为了解决这个问题,有人重写了toFixed方法,使用了自定义的逻辑来进行四舍五入。具体的重写代码如下: ```javascript Number.prototype.toFixed = function(d) { var s = this + ""; if (!d) d = 0; if (s.indexOf(".") == -1) s += "."; s += new Array(d + 1).join("0"); if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (d + 1) + "})?)\\d*$").test(s)) { var s = "0" + RegExp.$2, pm = RegExp.$1, a = RegExp.$3.length, b = true; if (a == d + 2) { a = s.match(/\d/g); if (parseInt(a\[a.length - 1\]) > 4) { for (var i = a.length - 2; i >= 0; i--) { a\[i\] = parseInt(a\[i\]) + 1; if (a\[i\] == 10) { a\[i\] = 0; b = i != 1; } else break; } } s = a.join("").replace(new RegExp("(\\d+)(\\d{" + d + "})\\d$"), "$1.$2"); } if (b) s = s.substr(1); return (pm + s).replace(/\.$/, ""); } return this + ""; }; ``` 这段代码重写了toFixed方法,使用了自定义的逻辑来进行四舍五入。但需要注意的是,这段代码并非官方提供的方法,使用时需要谨慎。 #### 引用[.reference_title] - *1* [JavaScript toFixed()四舍五入问题](https://blog.csdn.net/qq_38877858/article/details/108111072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [toFixed方法无法精准四舍五入的问题](https://blog.csdn.net/weixin_42597658/article/details/116535343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值