lat*1e6精度还是不对

来源:3-3 数据类型之浮点类型【实际应用技巧】

奥利给666

2020-12-04

mac电脑,clion,编译器选的是C11

int main(int argc, char **argv) {
    float a_float = 3.13f;
    float lat = 39.90815f;
    int lat06 = (int)(lat * 1e6);
    printf("%d\n", lat06);
    printf("%d\n", lat06 - (int)lat*1e6);
    return 0;
}

输出结果是
39908149
73896

最后三位并不是预想的150

写回答

2回答

bennyhuo

2020-12-04

lat06 - (int)lat*1e6 这个就更没道理了。后面的操作数会先把 lat 强转为 39,再乘以 1e6,这时候实际上得到了 double 类型,用 %d 格式化出来的 73896 没有意义。

0
1
奥利给666
谢谢老师,可能是我这块理解的还不透彻
2020-12-05
共1条回复

bennyhuo

2020-12-04

放到 39.908 的后面,149 和 150 其实没差什么,最后一位本身就是是不可靠的。另外,你要想验证浮点型精度,不要乘以 1e6,往整型转换的过程中本身会产生数值的截断。

0
0

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程