|
发表于 2015-6-8 10:16
|
显示全部楼层
本楼为最佳答案
本帖最后由 爱疯 于 2015-6-9 15:45 编辑
以下只是个人理解,可能有错误的解释
- - - - - - - - - - - - - - - - - - - - - - - - - -
1)
Sub test()
Debug.Print TypeName(85), VarType(85) 'vbInteger 2 整数
Debug.Print TypeName(86.85), VarType(86.85) 'vbDouble 5 双精度浮点数
End Sub
从结果可知
85和1,都是整型
86.85,是双精度浮点型
- - - - - - - - - - - - - - - - - - - - - - - - - -
2)查VBA帮助中的数据类型,可知
Integer占2 个字节
Double占8 个字节
- - - - - - - - - - - - - - - - - - - - - - - - - -
3)
=B2-C2-D2
=86.85-85-1
数值之间,不同数据类型不能直接运算,需先执行"自动类型提升"(小向大提升)操作,该操作由系统自动完成。
85和1,占2个字节,好比能装2两饭的碗。
86.85,占8个字节,好比能装8两饭的碗。
自动类型提升就是把85和1,换成能装8两饭的碗(更大的碗必然可装下原先的值)。
现在是一样的碗,86.85-85-1就可直接运算。
结果装在一个能装8两饭的碗里。
对B2-C2-D2按F9可看到,0.849999999999994,说明这是经过自动类型提升后更精确的运算结果。
B4却是0.85,由于某种原因(单元格格式;或者excel最多保留15位有效数字;自动类型转换;...),总之损失了精度。
- - - - - - - - - - - - - - - - - - - - - - - - - -
4)解释B4,B5
B4
=B2-C2-D2
=86.85-85-1
=0.849999999999994
按B4单元格格式,自动保留2位小数后,得0.85
B5
=ROUND(B4,1)
=ROUND(0.849999999999994,1)
按ROUND函数,自动保留1位小数后,得0.80
- - - - - - - - - - - - - - - - - - - - - - - - - -
5)将精度设为所显示的精度
勾上"将精度设为所显示的精度"后,在ROUND里的B4就不是0.849999999999994,而是B4显示的精度,0.85。
所以B5
=ROUND(B4,1)
=ROUND(0.85,1)
=0.90
为证明,我在B6加了一个函数
B6
=ROUND(B2-C2-D2,1)
=ROUND(0.849999999999994,1)
=0.80
由于ROUND的参数1是直接引用B2-C2-D2的结果,所以没有受"将精度设为所显示的精度"的影响。
取整问题2.rar
(12 KB, 下载次数: 6)
|
|