double 的取值范围是 0.000~001 到 1000~00 ,有几个 0 取决于系统,现在需要判断这个 double 有几位,既
1000-> 3
1001-> 3
12002-> 4
0.01-> 2
0.007-> 3
我最初的打算通过对数,但发现存在问题
int main(){
double A = 0.001;
double B = 0.0001;
int A1 = static_cast<int>(::fabs(log10(A)));
int B1 = static_cast<int>(::fabs(log10(B)));
std::cout<<"A1: "<<A1<<std::endl;
std::cout<<"B1: "<<B1<<std::endl;
}
上面这段代码在 ubuntu20.04 上,使用 G++编译后运行,结果为
A1: 2
B1: 4
我在 win10 上使用 VS2019 编译,结果为 A1:3 B1 :4 。。。
所以我想问下有没有更好的办法来判断?
1
tun 2023-09-18 18:46:31 +08:00
起猛了 看成 Diablo 有几位
|
2
agagega 2023-09-18 18:48:23 +08:00
还是没太看懂你说的 double 有几位是什么意思,1000 (如果是十进制)不是 4 位吗? 1.20012 按楼主的意思应该算几位呢?
|
3
hello2090 2023-09-18 18:51:16 +08:00
一直 X10 ,直到结果转为整数再转为 double, 是一样的
|
5
zihuyishi 2023-09-18 19:03:02 +08:00 1
计算机浮点数不是以 2 做指数位么,你这个精度要想有意义还是要限制十进制下小数点精确到几位才有意义吧。
比如 std::cout << std::setprecision(5) << f << '\n'; 然后直接数字符串去掉前后 0 的位数 |
6
Ericcccccccc 2023-09-18 19:04:17 +08:00
感觉问题没定义清楚, 1/3 有几位?
double 值是算出来的还是输入的? |
7
geelaw 2023-09-18 19:06:40 +08:00 via iPhone
建议重新思考你的设计。因为 IEEE-754 双精度数里面 0.000001 等于 0.000000999999999999999954748111825886 ,你希望传入这个数的时候得到 6 还是 7 ?
|
8
liberize 2023-09-18 19:10:04 +08:00 via Android
看一下 g++ 的 log10(A) 的值是不是 -2.9999999...。涉及到浮点数这种问题很常见。
|
9
0TSH60F7J2rVkg8t 2023-09-18 19:10:47 +08:00
用字符串啊,楼主的需求就是取小数点后三位的值,Round 一下得到只有 3 位的小数字符串,查找“.”,没找到,算字符长度就是答案,找到了“.”,算点后的长度减掉最后结尾往回数的第一个不为 0 的位数的差。
|
10
LuckyPocketWatch OP |
11
LuckyPocketWatch OP |
12
LuckyPocketWatch OP |
13
cnbatch 2023-09-18 20:02:49 +08:00
那就 sizeof 一下看看占多少个字节
|
14
weeei 2023-09-19 10:29:04 +08:00
可以根据浮点数的编码标准 IEEE 来判断尾数部分后面为 0 的位数。
|