C#-是否可以从文本输入恢复双精度?

C#-是否可以从文本输入恢复双精度?,c#,double,precision,C#,Double,Precision,我有一门课是根据车票上的高度来计算长度的。它已经存在多年了,并且运行得很好。。。直到我们得到一张独一无二的票 它们由销售人员以英寸为单位输入,通常是3、4或3.5等漂亮的数字,并存储在数据库中-但这一数字是3.66666(或11/3),但它被输入为3.666,并由于精度降低而导致计算失败 我想了一点办法来恢复某些数字的精度,但我想也许有人知道一种更好的方法来让3.666或93.1333恢复到数字+三分之二的状态 谢谢, Mick.很难得到double as的准确值 报告说: 记住一个浮点数 只能

我有一门课是根据车票上的高度来计算长度的。它已经存在多年了,并且运行得很好。。。直到我们得到一张独一无二的票

它们由销售人员以英寸为单位输入,通常是3、4或3.5等漂亮的数字,并存储在数据库中-但这一数字是3.66666(或11/3),但它被输入为3.666,并由于精度降低而导致计算失败

我想了一点办法来恢复某些数字的精度,但我想也许有人知道一种更好的方法来让3.666或93.1333恢复到数字+三分之二的状态

谢谢,
Mick.

很难得到double as的准确值

报告说:

记住一个浮点数 只能近似一个十进制数, 这就是 浮点数决定了 准确地说,这个数字接近a 十进制数。默认情况下,双精度 值包含15个十进制数字 精度,但最大值为17 数字在内部维护。这个 浮点数的精度 这有几个后果:

  • 两个浮点数,对于特定的 精度可能不相等 因为它们的最低有效位数 它们是不同的

  • 一种使用浮点的数学运算或比较运算 数字可能不会产生相同的结果 如果使用十进制数,因为 浮点数可能不正确 精确地逼近小数点 号码


正如你在评论中解释的,我现在明白你的观点了。我查过了号码:

  168000 / 3.666     = 45826.5139
  168000 / 3.666666  = 45818.1901488
  168000 * 3 / 11    = 45818.1818182 
有8张票不同。我觉得你的问题可以用很多方法解决。例如,在用户输入方面。或者在数据库方面。但回到你的问题:

如何将3.666或93.1333转换回其数字+三分之二 地位

您正在寻找将十进制(或双精度)转换为分数的方法。 关于这一点,已经有一个问题:有很多答案。我测试了其中一些,没有一个是令人满意的。有些甚至不会复发。也许我错过了正确的一个,你可以自己看

无论如何,我相信您不需要完全实现从1.666到3/2的转换,因为这并不容易,而且您有一个真实世界的大小。您已经说过,大多数时间数字都在3、3.5、4等左右。因此,我建议您看看我上面链接的一个问题,并搜索一种检测重复次数的算法。这里也讨论了这个问题
在将1.666转换为1.666666之后,因为1/1000000英寸不会扰乱您的计算,正如上面的数字所示。

如何知道数据库中的3.666是重复出现的还是仅仅是“3.666”?如果无法知道差异,如何知道何时尝试恢复精度?3.66666和3.666之间的差异如何使您的计算失败?您可以对字符串进行处理吗?可能更容易注意到它以一个重复出现的数字结尾,并附加该数字的更多副本。完全不清楚应该发生什么。11/3既不是3.666也不是3.66666。我支持这样一个问题:如何使计算“失败”。定义“失败”。@DonBoitnott 11/3是3.666。。。反复出现@netaholic-一张票子的长度小于4英寸,它位于一卷约14000英尺长的纸上,并且有多个卷,因此,计算票子的精度损失在于知道卷长。我认为这可能是一个无法解决的问题,但我的技巧是检查最后几个数字,看看它们是否相同,但只是想知道这里是否有人遇到过类似的问题,并提出了一个更明智的解决方案-无论如何,谢谢,@netholic谢谢-第二个链接真的很有用。我将学习我的搜索技术:)再次感谢。