假设没有发生未经检查的溢出,.NET 的整数加法和乘法(int
,long
等)是可交换的和关联的,就像数学中的实数一样。由于精度的限制,浮点算术 (float
和double
) 是可交换的,但并不总是精确关联的。来自维基百科(文章中有一个例子):
虽然浮点加法和乘法都是可交换的(a + b = b + a 和 a×b = b×a),但它们不一定是关联的。也就是说,(a + b) + c 不一定等于 a + (b + c)。
这是一个例子:
a: 0.825402526103613
b: 0.909231618470155
c: 0.654626872695343
(a*b)*c: 0.491285733573819
a*(b*c): 0.49128573357382
有一些示例,当转换为 a 时,结果看起来相同string
,但不同((a*b)*c != a*(b*c)
is true
,并(a*b)*c - a*(b*c)
返回一个小值, not 0
)。
a: 0.613781429181705
b: 0.648859122604532
c: 0.795545351596337
(a*b)*c: 0.316832045751117
a*(b*c): 0.316832045751117
difference: 5.55111512312578E-17