最近遇到这个问题,不难吧,不过搜网上的东西,没看到比较合心水的答案,自己搞了两种做法,请君侧耳为我听。
乘10法
这种想法最容易想到,就是将数字乘10,乘N次,加上0.5后取整,最后再除回去。加上0.5取整应该很容易理解,是等价于四舍五入的,因为X.49999……+0.5后取整是不会进位的,结果是X;而X.5000……1+0.5后取整会变成X+1(当然忽略double或float能表示的精度)。
比如:
23.3451保留两位小数,那么连续乘10,2次,得到2334.5,加上0.5后取整得到23345,再除回去,变成23.35,是不是对了呢?
简单代码如下:
#include <stdio.h>
#include <cmath>
typedef long long LL;
double round(double number, unsigned int bits) {
LL integerPart = number;
number -= integerPart;
for (unsigned int i = 0; i < bits; ++i)
number *= 10;
number = (LL) (number + 0.5);
for (unsigned int i = 0; i < bits; ++i)
number /= 10