Floating point 在tcl中检查浮点数是否为整数

Floating point 在tcl中检查浮点数是否为整数,floating-point,numbers,tcl,Floating Point,Numbers,Tcl,我是tcl的新手。我试图检查一个给定的数字是否是一个整数,但似乎找不到一个简单的方法来做到这一点 所以我有一个数字2,它正在检查它是否在网格上。如果不是整数,则不在网格上 set numberOne 7.5 set grid 2.5 set numberTwo [expr ($numberOne/$grid) ] if {[string is integer -strict $numberTwo} { do something } else { do something els

我是tcl的新手。我试图检查一个给定的数字是否是一个整数,但似乎找不到一个简单的方法来做到这一点

所以我有一个数字2,它正在检查它是否在网格上。如果不是整数,则不在网格上

set numberOne 7.5
set grid 2.5
set numberTwo [expr ($numberOne/$grid) ]

if {[string is integer -strict $numberTwo} {
    do something
} else {
    do something else
}
上面的代码对我不起作用,因为在这种情况下,numberTwo将作为浮点数3.0返回

Python有如下功能:

x = 7.5
y = 2.5
z = x/y

if z%1 == 0
   then do something
else
   do something else
在tcl中有没有类似的方法? 如果不是,另一种选择可能是:

取数字wo的十进制值,检查它是0还是非0 所以取6.555的东西返回555,取6.0,返回0。 我可以这样做:

if {$value == 0} {then do something} else {do something else}

看来你可能不知道


看来你可能不知道


这实际上是许多人正在寻找的解决方案

proc is_float_whole { float } {
  return [expr abs($float - int($float)) > 0 ? 0 : 1]
}

这实际上是许多人正在寻找的解决方案

proc is_float_whole { float } {
  return [expr abs($float - int($float)) > 0 ? 0 : 1]
}

int、ceil或round函数也可以工作。这都要感谢它们。在我的例子中,$value是通过一些涉及浮点的计算来计算的,例如:set value[expr$someFloat*$anotherFloat/$anotherNum]put“value is$value”//例如,它可能正好是1750.0 set floorValue[expr floor$value]put“floor of value is$floorValue”//如果我这样做,现在也是1750.0了:如果{$value==floor$value}{put“this on grid”}否则{not on grid}这并不总是有效的,因为您所说的浮点数问题。有什么办法可以解决吗?@acheong87-我想我设法解决了这个问题。我将$numberOne乘以一个大数字numberOne始终在x1e-6中,因此如果我将它乘以1e6或1e9,并将网格值乘以名称乘法器,那么您建议的方法有效。这很奇怪,因为数字本身在乘法后不会改变。所以以前是这样的:numberOne=8.885x1e-6,grid=0.005x1e-6,所以value=1777,现在是:numberOne=8.885,grid=0.005,所以value=1777。以前,它无法识别value==floorvalue,但现在它可以正确识别。必须是一个浮动问题。int、ceil或round函数也可以工作。多亏了这两个函数。在我的例子中,$value是通过一些涉及浮点的计算来计算的,例如:set value[expr$someFloat*$anotherFloat/$anotherNum]put“value is$value”//例如,它可能正好是1750.0 set floorValue[expr floor$value]put“floor of value is$floorValue”//如果我这样做,现在也是1750.0了:如果{$value==floor$value}{put“this on grid”}否则{not on grid}这并不总是有效的,因为您所说的浮点数问题。有什么办法可以解决吗?@acheong87-我想我设法解决了这个问题。我将$numberOne乘以一个大数字numberOne始终在x1e-6中,因此如果我将它乘以1e6或1e9,并将网格值乘以名称乘法器,那么您建议的方法有效。这很奇怪,因为数字本身在乘法后不会改变。所以以前是这样的:numberOne=8.885x1e-6,grid=0.005x1e-6,所以value=1777,现在是:numberOne=8.885,grid=0.005,所以value=1777。以前,它无法识别value==floorvalue,但现在它可以正确识别。一定是一个浮动的发行器!虽然您在问题中使用的大多数数字都是用浮点表示的,但许多数字都不是,例如0.1、6.555。确定一个数字是否“完全是一个整数”是非常困难的,因为你通常没有一个精确的数字来开始。这不是Tcl的问题,这是一个浮点数问题,Tcl碰巧在数学和其他一些方面使用浮点数。嗨,是的,我理解。这就是为什么当值为整数时,即使我的下限值与我的值相同。由于浮点计算,如果{value==floorvalue}对我不起作用。它在某些情况下有效,但在其他情况下无效。例如,1750.0==1750.0是正确的,但另一个时间1775.0==1775.0不是正确的,因为1775.0通常可以在系统中保存为1775.000000000001?小心!虽然您在问题中使用的大多数数字都是用浮点表示的,但许多数字都不是,例如0.1、6.555。确定一个数字是否“完全是一个整数”是非常困难的,因为你通常没有一个精确的数字来开始。这不是Tcl的问题,这是一个浮点数问题,Tcl碰巧在数学和其他一些方面使用浮点数。嗨,是的,我理解。这就是为什么当值为整数时,即使我的下限值与我的值相同。由于浮点计算,如果{value==floorvalue}对我不起作用。它在某些情况下有效,但在其他情况下无效。例如,1750.0==1750.0是真的,但另一个时间1775.0==1775.0不是真的 因为通常1775.0可以在系统中保存为1775.000000000001?