V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LuckyPocketWatch
V2EX  ›  C++

如何判断一个 double 有几位?

  •  
  •   LuckyPocketWatch · 2023-09-18 18:42:21 +08:00 · 1791 次点击
    这是一个创建于 444 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    现在的情况是,底层出来的值就是一个 double ,无法改变
    LuckyPocketWatch
        11
    LuckyPocketWatch  
    OP
       2023-09-18 19:35:08 +08:00
    @agagega
    1.20012 -> 1
    0.1001 -> 1
    LuckyPocketWatch
        12
    LuckyPocketWatch  
    OP
       2023-09-18 19:36:25 +08:00
    @geelaw
    7...眼花看错了
    0.1 -> 1
    0.01 -> 2
    0.001 -> 3
    以此类推
    cnbatch
        13
    cnbatch  
       2023-09-18 20:02:49 +08:00
    那就 sizeof 一下看看占多少个字节
    weeei
        14
    weeei  
       2023-09-19 10:29:04 +08:00
    可以根据浮点数的编码标准 IEEE 来判断尾数部分后面为 0 的位数。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4281 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:01 · PVG 09:01 · LAX 17:01 · JFK 20:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.