< 返回版块

DoraemonSong 发表于 2020-02-17 01:08

新手,刚入坑敲代码,没有任何编程基础,刚开始看rust的教程,有一个很基础的问题,请大佬帮忙解答一下,谢谢🙏,百度了一下,没百度到结果,如果是很傻的问题,随便喷

当我用 f32 类型的变量做比如 11.1 +12.2 这样的运算的时候,结果是23.3,可是如果是f64类型的变量做运算, 11.1 + 12.2 = 23.299999999999997,请问这是为什么呢?代码和输出如下:

1、f64的运算

fn main() {
    let x:f64 = 11.1 + 12.2 ;
    let y:f64 = 95.51 + 4.31;
    let z:f64 = 10.31 + 20.21;
    println!("x is {}",x);
    println!("y is {}",y);
    println!("z is {}",z);
}

输出:

x is 23.299999999999997
y is 99.82000000000001
z is 30.520000000000003

2、f32的运算

fn main() {
    let x:f32 = 11.1 + 12.2 ;
    let y:f32 = 95.51 + 4.31;
    let z:f32 = 10.31 + 20.21;
    println!("x is {}",x);
    println!("y is {}",y);
    println!("z is {}",z);
}

输出:

x is 23.3
y is 99.82
z is 30.52

评论区

写评论
zhongsigang 2020-02-17 22:24

你要的是decimal https://crates.io/crates/decimal

AlephAlpha 2020-02-17 16:25

关于浮点数计算的问题,果壳网的这篇文章说得比较清楚了:https://www.guokr.com/article/27173/

f32 也会出现类似的问题,比如说 1.1 + 1.2 = 2.3000002,只是楼主选的几个例子恰好都避开了。

AlephAlpha 2020-02-17 15:59

欢迎来到秘密机器人网络!

7sDream 2020-02-17 11:14

https://0.30000000000000004.com/

xjkdev 2020-02-17 02:49

简单来说就是,这个数字虽然在十进制下是“整数”,在二进制下是一种除不尽的状态,所以就会造成不准确的情况。

jonirrings 2020-02-17 01:40

这是浮点数的表示问题。详情参考或者搜索ieee 754。

阮一峰的关于浮点数文章也可以略作参考看看。

1 共 6 条评论, 1 页