f#整数浮点数模数1.0 = 1.0?

Ava*_*nos 0 .net math f# modulo

好的,我有两个功能,第一个看起来像这样:

let dlth x = float (x.ToString().Length)
Run Code Online (Sandbox Code Playgroud)

它采用浮点数并返回数字位数,该部分工作正常.第二个函数如下所示:

let droot x = ((x ** (1./(dlth x))) % 1.)
Run Code Online (Sandbox Code Playgroud)

它取一个浮点数并将其提升到等于1.0 /(位数)的幂,然后得到结果并且模数为1.0.整数应该为零.

所以对于droot 36.它需要(36.0**(1.0/2.0))这是6.0然后6.0 mod 1.0等于0.0;

现在,这个工作正常,直到我尝试编号81.0.(以及所有应该工作的81以上的数字)由于某种原因返回1.0,抛弃我的模式匹配.任何人都可以告诉我为什么会这样吗?

PostScript:这是Project Euler解决方案的一部分.如果您知道哪个问题,请不要发布Project Euler解决方案.我只需要帮助弄清楚为什么模数会返回有趣的结果

Bri*_*ian 8

浮点运算在任何语言中都充满了危险.在我的盒子上

printfn "%f" (0.9999999999999 % 1.0)        
Run Code Online (Sandbox Code Playgroud)

版画

1.000000
Run Code Online (Sandbox Code Playgroud)

希望这将有助于引导您朝着正确的方向前进.如果你真的想知道浮点数是否是"整数",那么例如减去最接近的整数并查看绝对值是否小于某个epsilon(例如0.00001)是一个不错的选择.