excel 匹配优于C#应用程序中的舍入

3xiyfsfu  于 2023-11-20  发布在  C#
关注(0)|答案(2)|浏览(134)

我目前正在将一个用于计算科学值的相当高级的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));

字符串

xwmevbvl

xwmevbvl1#

在C#中,

int x = 5;
var result = x / 2; // result is 2 and of type int

字符串
.因为执行的是整数除法。因此,如果涉及整数(不是没有小数的double,而是intlong类型的值),请确保在除法之前转换为double

int x = 5;
double result = x / 2; // result is 2.0 because conversion to double is made after division


这是可行的:

int x = 5;
var result = (double)x / 2; // result is 2.5 and of type double

x

int x = 5;
var result = x / 2.0; // result is 2.5 and of type double
int x = 5;
var result = 0.5 * x; // result is 2.5 and of type double

的一种或多种
如果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。这既快又准确。
对幻数使用常量增加了清晰度,对常用子表达式使用临时值使公式更易读。

const double mmHg_to_kPa = 0.133322;
const double g0 = 9.80665;

var p = preTestTestingDetails;
double moisture = EstimatedMoisture / 100.0;
double dryness = 1.0 - moisture;
double pressure_mmHg = p.BarometricPressure / mmHg_to_kPa;
double nozzleMean2 = p.NozzleMean * p.NozzleMean;
double nozzleMean4 = nozzleMean2 * nozzleMean2;

double result = 8.04E-05 *
    p.PitotCp * p.PitotCp * DeltaH * (tempDGMAverage + 273.0) / (StackTemp + 273.0) *
    ((pressure_mmHg + p.StackStaticPressure / g0 / 13.6) / pressure_mmHg) *
    (p.EstimatedMolWeight / (p.EstimatedMolWeight * dryness + 18.0 * moisture)) *
    dryness * dryness * nozzleMean4;


如果需要考虑精度,为什么不使用273.15而不是273.0?

dw1jzc5e

dw1jzc5e2#

几年前我对此进行了逆向工程。
尽管评论声称这是不正确的,但我对Excel本身进行了广泛的测试。

相关问题