我有一个基于票证上的高度进行长度计算的类。它已经存在了很多年,并且运行良好……直到我们获得唯一的票务尺寸。

他们是由销售人员以英寸为单位输入的,通常是3、4或3.5之类的漂亮数字,并存储在数据库中-但是此数字重复出现3.66666(或11/3),但输入为3.666,导致计算失败由于精度下降。

我想到过一些破解方法,可以恢复某些数字的精度,但是也许有人认为有一种更好的方法可以将3.666或93.1333恢复为数字+三分之二的状态?

谢谢,
米克

最佳答案

正如您在评论中解释的那样,我现在明白您的观点。我检查了数字:

  168000 / 3.666     = 45826.5139
  168000 / 3.666666  = 45818.1901488
  168000 * 3 / 11    = 45818.1818182


相差8张票。我觉得您的问题可以通过多种方式解决。例如,在用户输入方面。或在数据库方面。但是回到您的问题:


  如何将3.666或93.1333转换回数字+三分之二
  状态?


您正在寻找将小数(或双精度)转换为分数。
关于SO:Algorithm for simplifying decimal to fractions已有一个问题,其中有很多答案。我已经测试了其中一些,但没有一个令人满意。其中一些甚至不会复发。也许我错过了正确的选择,您可以自己看看。

无论如何,我相信您并不需要完全实现从1.666到3/2的转换,因为这并不容易,而且您拥有真实的尺寸。您已经说过,大多数时间数字都在3、3.5、4等附近。因此,我建议您看一下我上面链接的一个问题,并寻找检测重复数的算法。在这里也进行了讨论How to know the repeating decimal in a fraction?
在将1.666转换为1.666666之后,由于1/1000000英寸不会干扰您的计算,如上面的数字所示。

关于c# - C#-可以从文本输入恢复 double 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32820992/

10-10 10:08