我目前正在将一个用于计算科学值的相当高级的Excel表格转换为C#应用程序。然而,我在四舍五入方面遇到了一些问题。
我的所有值都以双精度存储,当您对它们执行少量操作时,它们会在可接受的精度范围内匹配Excel工作表(小数点后5或6位)。当他们进行相当大的除法,乘法,平方根运算时。他们开始漂移相当大的幅度。我在另一个点将整个代码库切换到小数点,以测试它是否解决了这个问题,它缩小了差距,但问题仍然存在。
我知道这是由于软件开发中十进制数的性质,但我必须尽可能地匹配Excel舍入。对这个主题的研究将我引向Excel用于舍入的标准,默认情况下使用稍微不同的一个。尽管学习了这一点,我仍然不确定如何继续复制优秀的四舍五入。我想知道是否有人有任何建议,以前在这个问题上的经验?
如有任何帮助,我们将不胜感激。
编辑:我只是想澄清一下,我没有四舍五入我的数字。工作表和我的代码上的四舍五入都是隐式应用的。我已经在一个完全不同的软件包(一个名为K2的表单生成器)中测试了相同的公式。结果数字与我的c#应用程序匹配,所以它似乎优于隐式四舍五入,在某种程度上有所不同。
其中一个令人反感的公式:
(8.04 * Math.Pow(10, -5)) *
(Math.Pow(preTestTestingDetails.PitotCp, 2)) * (DeltaH) *
(tempDGMAverage + 273.0) /
(StackTemp + 273) *
((preTestTestingDetails.BarometricPressure / 0.133322 +
((preTestTestingDetails.StackStaticPressure / 9.80665) / 13.6)) /
(preTestTestingDetails.BarometricPressure / 0.133322)) *
(preTestTestingDetails.EstimatedMolWeight /
((preTestTestingDetails.EstimatedMolWeight * (1 - (EstimatedMoisture / 100))) +
(18 * (EstimatedMoisture / 100)))) *
Math.Pow((1 - (EstimatedMoisture / 100)), 2) *
(Math.Pow(preTestTestingDetails.NozzleMean, 4));
字符串
2条答案
按热度按时间xwmevbvl1#
在C#中,
字符串
.因为执行的是整数除法。因此,如果涉及整数(不是没有小数的
double
,而是int
或long
类型的值),请确保在除法之前转换为double
。型
这是可行的:
x
的一种或多种
如果
EstimatedMoisture
的类型是int
,那么公式中唯一可能发生这种情况的地方是EstimatedMoisture / 100
。如果是这种情况,请使用EstimatedMoisture / 100.0
修复它。你可以写
8.04e-5
来代替8.04 * Math.Pow(10, -5)
,这样可以避免Math.Pow
的舍入效应!我不知道
Math.Pow(a, b)
是如何工作的,但一般公式是a^b=exp(b*ln(a))
。所以不要写Math.Pow(something, 2)
,写something * something
。这既快又准确。对幻数使用常量增加了清晰度,对常用子表达式使用临时值使公式更易读。
型
如果需要考虑精度,为什么不使用273.15而不是273.0?
dw1jzc5e2#
几年前我对此进行了逆向工程。
尽管评论声称这是不正确的,但我对Excel本身进行了广泛的测试。