如何判断一个 double 有几位?

239 天前
 LuckyPocketWatch

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 。。。

所以我想问下有没有更好的办法来判断?

1603 次点击
所在节点    C++
14 条回复
tun
239 天前
起猛了 看成 Diablo 有几位
agagega
239 天前
还是没太看懂你说的 double 有几位是什么意思,1000 (如果是十进制)不是 4 位吗? 1.20012 按楼主的意思应该算几位呢?
hello2090
239 天前
一直 X10 ,直到结果转为整数再转为 double, 是一样的
th00000
239 天前
@tun #1 头像太具有迷惑性!
zihuyishi
239 天前
计算机浮点数不是以 2 做指数位么,你这个精度要想有意义还是要限制十进制下小数点精确到几位才有意义吧。
比如 std::cout << std::setprecision(5) << f << '\n';
然后直接数字符串去掉前后 0 的位数
Ericcccccccc
239 天前
感觉问题没定义清楚, 1/3 有几位?

double 值是算出来的还是输入的?
geelaw
239 天前
建议重新思考你的设计。因为 IEEE-754 双精度数里面 0.000001 等于 0.000000999999999999999954748111825886 ,你希望传入这个数的时候得到 6 还是 7 ?
liberize
239 天前
看一下 g++ 的 log10(A) 的值是不是 -2.9999999...。涉及到浮点数这种问题很常见。
ahhui
239 天前
用字符串啊,楼主的需求就是取小数点后三位的值,Round 一下得到只有 3 位的小数字符串,查找“.”,没找到,算字符长度就是答案,找到了“.”,算点后的长度减掉最后结尾往回数的第一个不为 0 的位数的差。
LuckyPocketWatch
239 天前
@geelaw
6

现在的情况是,底层出来的值就是一个 double ,无法改变
LuckyPocketWatch
239 天前
@agagega
1.20012 -> 1
0.1001 -> 1
LuckyPocketWatch
239 天前
@geelaw
7...眼花看错了
0.1 -> 1
0.01 -> 2
0.001 -> 3
以此类推
cnbatch
239 天前
那就 sizeof 一下看看占多少个字节
weeei
238 天前
可以根据浮点数的编码标准 IEEE 来判断尾数部分后面为 0 的位数。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/974948

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX