只要使用浮点,就无法在内存中精确表示0.1,因此我们知道该值通常为0.10000000000000004。
但是当使用去添加0.1和0.2。我得到0.3。
fmt.Println(0.1 + 0.2)
// Output : 0.3
为什么0.3而不是0.30000000000000004出现?
这是因为在打印时(例如与fmt
包装一起),打印功能已经四舍五入到一定数量的小数位。
请参阅以下示例:
const ca, cb = 0.1, 0.2
fmt.Println(ca + cb)
fmt.Printf("%.20f\n", ca+cb)
var a, b float64 = 0.1, 0.2
fmt.Println(a + b)
fmt.Printf("%.20f\n", a+b)
输出(在Go Playground上尝试):
0.3 0.29999999999999998890 0.30000000000000004 0.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
包的默认舍入为“外观”
。
本文向大家介绍0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?相关面试题,主要包含被问及0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?时的应答技巧和注意事项,需要的朋友参考一下 JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,导致精度变化。不是所有浮点数都有舍入误差。二进制能精确地表示位数有
我完全理解为什么0.1 0.2不等于0.3,因为是浮点。在大多数编程语言中,是。 但是在Excel给出1
这关系到Java。据我所知,由于二进制表示,0.1不能用Java完美表示。那使得 错误的但是,为什么会这样呢 真的吗?
我对浮点数有一个基本的了解,并且正在阅读这篇文章,其中说: 0.1 0.2:这等于0.3,但在浮点数中:为false。这是因为0.1、0.2和0.3不能精确地表示在基2浮点数中。 根据浮点数的性质,这是正确的,但我编写了一个简单的程序来测试: 但是输出实际上是。以下是我的两个问题: > 我想发生的是,因为C使用了从四舍五入到五舍五入的模式,所以在四舍五入之后,它恰好是真的,我的理解正确吗? 如果我
这是怎么回事?
本文向大家介绍解决JavaScript中0.1+0.2不等于0.3问题,包括了解决JavaScript中0.1+0.2不等于0.3问题的使用技巧和注意事项,需要的朋友参考一下 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!==0.3,这是为什么呢?这个问题也会偶尔被用来当做面试题来考查面试者对JavaScript的数值的理解程度。