好的我有两个功能,第一个看起来像这样:
let dlth x = float (x.ToString().Length)
取浮点数并返回数字位数,该部分工作正常。第二个函数如下所示:
let droot x = ((x ** (1./(dlth x))) % 1.)
取浮点数并将其提升到等于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解决方案。我只需要帮助弄清楚为什么模数会返回有趣的结果
答案 0 :(得分:8)
浮点运算在任何语言中都充满了危险。在我的盒子上
printfn "%f" (0.9999999999999 % 1.0)
打印
1.000000
希望这有助于引导您朝着正确的方向前进。如果你真的想知道浮点数是否是“整数”,那么例如减去最接近的整数并查看绝对值是否小于某个epsilon(例如0.00001)是一个不错的选择。
答案 1 :(得分:1)
如果你的浮动不准确,你可以使用.NET的decimal
数据类型(它能够代表基数为10的所有数字)来获得性能。除此之外,使用更多精度(double
)或整数数学。
答案 2 :(得分:0)
我同意Brian的观点,依赖于确切的浮点表示是危险的,但我无法重现您的问题。对我而言,droot 81.0
给出了0.0
的预期结果。您使用的是什么版本的F#?你在.NET或Mono上运行吗?