Vba 截断值
我正试图截断一些值,因为舍入函数不适合我的问题,因为我想将我正在处理的值与其他值进行比较,但如果它们被向上舍入或向下舍入,我不会这样做,所以我会出错 不管怎样,我已经尝试了很多东西,但仍然没有得到我想要的。。。必须是类似于Vba 截断值,vba,excel,Vba,Excel,我正试图截断一些值,因为舍入函数不适合我的问题,因为我想将我正在处理的值与其他值进行比较,但如果它们被向上舍入或向下舍入,我不会这样做,所以我会出错 不管怎样,我已经尝试了很多东西,但仍然没有得到我想要的。。。必须是类似于=TRUNC的内容,但它在VBA中不可用 我的最后一次尝试几乎满足了我的要求: .Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000 但问题是,有时当我有一个“-1”时,它会给出“-1.001”,
=TRUNC
的内容,但它在VBA中不可用
我的最后一次尝试几乎满足了我的要求:
.Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000
但问题是,有时当我有一个“-1
”时,它会给出“-1.001
”,这样会把事情搞砸。。。我真的不知道它为什么会这样做,因为我在*1000
之后放了一个msgbox(在/1000
之前),结果是-1000。因此,问题来自部门
-->因此,如果有人知道更好的截断解决方案,或者您知道为什么1000/1000
会给我-1.001
提前感谢您
另一个解决办法是:
Range(.Cells(iLine, iCol), .Cells(iLine, iCol)).Select
Selection.NumberFormat = "0.000"
Range(.Cells(iLine, iCol), .Cells(iLine, iCol)) = Range(.Cells(iLine, iCol), .Cells(iLine, iCol)).Text * 1
但这不是我想要的,因为有两件事:
编辑:在我的行
上进行几次测试后。Cells(iLine,iCol)=Int(.Cells(iLine,iCol)*1000)/1000
问题似乎来自Int()
函数。因为-1*1000=-1000
但是int(-1000)=-1001
。有人知道为什么会这样吗
即使我将这个单元格的精度提高了-1.000000,我也会遇到同样的问题,只有当我在它上面加Int()时,额外的1 appears将十进制(即浮点)数截断为整数的一种方法是使用
Int
函数
MsgBox Int(1.234)
或
…两者都返回1
请注意,此函数在VBA和工作表公式中都有效
浮点舍入误差 在对数据应用数字格式之前,通过设置“显示精度”选项,可以经常防止浮点舍入错误影响工作。此选项强制工作表中每个数字的值达到工作表上显示的精度 注意:使用显示的精度选项可能会产生累积计算效果,这会使数据随着时间的推移变得越来越不准确。仅当您确定显示的精度将保持数据的准确性时,才使用此选项 更多关于这方面的信息,请访问和
编辑:直接参考工作表时的舍入问题 我不能在这里复制您的问题,但它可能取决于其他因素,如单元格格式和Excel的设置 确保没有这个问题的最简单/最好的方法可能是在进行任何计算之前将数字放入整数变量中 因此,不是:
Range("A2") = Int( Range("A1") / 1000 ) * 1000
使用:
更多信息:
- 办公室支助:
- MSDN:
- 办公室支助:
- 办公室支助:
另一编辑: 我很高兴你认为你找到了解决办法,但我担心的是你所描述的不是正常行为。证明: …因此,在这种情况下,虽然您的变通方法可能会为您提供正确的答案,但可能会有其他计算受到影响,这些影响并不明显
有许多设置可能会影响这一点。我建议用一个新的空白工作簿再试一次,最好是在重新启动之后。所以我想截断我的值,得到一个错误的数字。为了测试是否存在舍入问题,我尝试舍入到10-6,然后将其截断到10-3,结果成功:
.Cells(iLine, iCol) = Round(.Cells(iLine, iCol), 6)
.Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000
我觉得这并不能告诉我们为什么int(-1000.000000)
会给出-1001.000000
,但是,嘿,这很有效
谢谢大家
编辑:我刚刚意识到Int()实际上是循环的,因为微软的文档说Int(-4.5)=-5
,所以我猜我的-1实际上是-1.0000[…]00001
。你可以使用Trunc()
函数:
.Cells(iLine, iCol).Formula="=Trunc(" & .Cells(iLine, iCol).Value & ",3)"
.Cells(iLine, iCol).Value = .Cells(iLine, iCol).Value
Int(.Cells(iLine,iCol)*1000)/1000
如果.Cells(iLine,iCol)为我提供1
.Value
为-1
。作为盲镜头,检查你是否有任何有趣的格式。或者尝试.Value2
而不是.Value
@jack-请参阅对我的重新使用的编辑:如果数字为负数,则返回下一个值或相等值Int(-1000.0000001)=-1001
而Fix(-1000.0000001)=-1000
。至于你的问题,有人能解释一下为什么“1000/1000给我-1.001”吗?请阅读。特别是“舍入错误”部分。@VincentG,它只是移动了问题:Fix(-999.999999999999)=-999
。这是一个浮点数学问题,使用Int
或Fix
显示一组小数将导致最后一个小数不准确。@JackA,我误解了。您希望从(例如,1.0001
)返回什么?你只是想知道“为什么”吗?谢谢你的消息来源我会查一查。要回答这个问题,我有一个x值,乘以1000,然后使用int()对其进行处理,然后再除以1000。但是如果x=-1,在这种特殊情况下,它给出的是-1.001,而不是-1。还可以查看我对原稿的编辑post@JackA-什么数据类型是x
?例如,您使用的是Integer
还是Single
,这可能会有所不同。或者,如果您根本不声明它们,那么它们可能是变量
。x的数据类型实际上是一个单元格()
。在这种情况下,我建议您不要直接引用单元格,而是将其放入一个整数变量中,并用它进行计算。我将用一个例子来编辑我的答案,事实是,int(-1000.000000)
在正常系统上不返回-1001
,带有regul
.Cells(iLine, iCol) = Round(.Cells(iLine, iCol), 6)
.Cells(iLine, iCol) = Int(.Cells(iLine, iCol).Value * 1000) / 1000
.Cells(iLine, iCol).Formula="=Trunc(" & .Cells(iLine, iCol).Value & ",3)"
.Cells(iLine, iCol).Value = .Cells(iLine, iCol).Value