栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么0.1 + 0.2在Google Go中获得0.3?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么0.1 + 0.2在Google Go中获得0.3?

这是因为在打印时(例如与

fmt
包装一起),打印功能已经四舍五入到一定数量的小数位。

请参阅以下示例:

const ca, cb = 0.1, 0.2fmt.Println(ca + cb)fmt.Printf("%.20fn", ca+cb)var a, b float64 = 0.1, 0.2fmt.Println(a + b)fmt.Printf("%.20fn", a+b)

输出(在Go Playground上尝试):

0.30.299999999999999988900.300000000000000040.30000000000000004441

首先,我们使用常量,因为这与使用type的(非常量)值不同

float64

数字常数表示任意精度的精确值,并且不会溢出。

但是在打印的结果时

ca+cb
,必须将常量值转换为非常量类型的值才能传递给
fmt.Println()
。该值将是类型
float64
,不能完全表示
0.3
。但是
fmt.Println()
会将其舍入为〜16个小数位,即
0.3
。但是,当我们明确声明要以20位数字显示时,我们会发现它不准确。请注意,只会
0.3
将转换为
float64
,因为常量算术
0.1+0.2
将由编译器评估(在编译时)。

接下来,我们从type变量开始,

float64
毫不奇怪,输出不是
0.3
完全正确,但是这次即使使用默认舍入,我们得到的结果也不同于
0.3
。这样做的原因是,在第一种情况(常量)中,它是
0.3
经过转换的,但是这次都是
0.1
0.2
都转换为
float64
,但都不是精确的,将它们相加会导致与的距离更大
0.3
,足以使
fmt
包的默认舍入为“外观”



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号