gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:20 25 4
gpt4 key购买 nike

我目前正在将一个用于计算科学值(value)的相当高级的 Excel 工作表转换为 C# 应用程序。但是,我在四舍五入方面遇到了一些问题。

我的所有值都存储为 double 值,当您对它们执行少量操作时,它们与 Excel 工作表的匹配精度在可接受的范围内(小数点后 5 位或 6 位)。当它们经过相当大的除法、乘法、平方根运算时。他们开始以相当大的幅度漂移。我在另一点将整个代码库切换为小数以测试它是否解决了这个问题,它缩小了差距,但问题仍然存在。

我知道这是由于软件开发中小数的性质造成的,但我必须尽可能地匹配 excel 舍入。对这个主题的研究使我转向了 excel 用于舍入的标准,而且默认情况下 C# 似乎使用了一个略有不同的标准。尽管了解了这一点,但我仍然不确定如何继续复制 excels 舍入。我想知道是否有人对此主题有任何建议或以前的经验?

如有任何帮助,我们将不胜感激。

编辑:我只是想澄清一下,我并没有四舍五入我的数字。隐含地应用了工作表和我的代码上的舍入。我在一个完全不同的软件包(名为 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));

最佳答案

在 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
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/100,以防 EstimatedMoisture 的类型为 int。如果是这种情况,请使用 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。这既更快又更准确。

对魔数(Magic Number)使用常量可以增加清晰度。对常见的子表达式使用临时值使公式更具可读性。

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?

关于c# - 匹配优于 C# 应用程序中的舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58401938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com