为什么结果A1(0.224)和B1(0.224000006914139)不同?
Sub a()
Cells(1, 1) = Application.WorksheetFunction.Round(Rnd(-1), 4)
Cells(1, 2) = Round(Rnd(-1), 4)
Cells(1, 3) = "=a1=b1"
Cells(1, 4) = "'0.2240"
End Sub
字符串
如何复制B1并粘贴到D1的四个小数位而不丢失尾随零?我可以用rnd(-1)
或cells(1,2)
来改变最后一个"'0.2240"
吗?非常感谢。
2条答案
按热度按时间krcsximq1#
您的问题源于
Rnd
返回数据类型Single
的事实。See here当
Round
被传递numdecimalplaces
> 0和一个Single
值时,它接受该数据类型,并返回一个Single
。WorksheetFunction.Round
没有:它返回一个双精度型。(如果Round
被传递一个Double
,它返回一个Double
)这并不重要 * 在监视器本身 * 内(请参见下面的监 windows 口图像以获取证据)
将值放入Excel单元格并转换为Excel的单元格数据类型时会出现此问题。
Single
的转换会导致浮点精度问题要解决这个问题,您的代码可以是
字符串
的数据
要将结果作为文本**放入
Cell(1, 4)
中,可以使用型
或
型
注意:
"'" &
是必要的,因为Excel将字符串识别为数字,并“帮助”将其转换回数字。quhf5bfb2#
根据最新的Microsoft文档,Round函数确实可以返回与Application.WorksheetFunction.Round方法不同的结果。以下是Microsoft在docs for Round function中对此的解释:
此函数返回通常称为银行家舍入的值。因此,在使用此函数之前请小心。要获得更可预测的结果,请在Excel中使用“舍入”函数。
下面是一个例子,说明即使所有数值都设置为Double,Round函数舍入结果也会非常奇怪:
下面是一段代码,其中所有数值都是Double格式:
字符串
舍入用例#1:

舍入情况#2:

正如您所看到的,在上面的案例#2中,Round将一半四舍五入为2。但是,如果您通过Application.WorksheetFunction.Round运行案例#2,则一半将四舍五入为3。
因此,如果你真的需要你的Round代码来实现对单元格内Round()函数的精确舍入结果,我强烈建议你使用Application.WorksheetFunction.Round而不是实际的Round。