【发布时间】:2026-01-10 22:55:02
【问题描述】:
有没有一种完全消除除法舍入误差的数学计算方法?
我正在尝试即时计算传感器输出的平均值,但经过数百万次迭代后,由于舍入误差,我的平均值正在漂移。
目前我将我的值存储在内存中,这可以正常工作,但会以内存/性能为代价。
EG
int number1 = 10;
int number2 = 3;
Console.WriteLine((number1/number2));
结果 = 3 (3.333~!)
float number1 = 10
float number2 = 3
Console.Writeline((number1/number2))
结果 = 3.33333325 (3.3~)
示例来自:https://docs.microsoft.com/en-us/dotnet/api/system.decimal?view=netcore-3.1
decimal dividend = Decimal.One;
decimal divisor = 3;
Console.WriteLine(dividend/divisor * divisor);
结果 = 0.9999999999999999999999999999 而不是 1(!!!)
这对我的应用程序来说是一个巨大的问题,因为我不断地将除法计算应用于传感器输出,因此我的值会慢慢漂移。 Windows 计算器似乎能够解决这个问题。
是否有任何可用的解决方案或者我必须创建自己的框架?
编辑: 一个可能的解决方案可能是实现 ⅓ 的分数。否则可能需要采用不同的方法来解决问题。
【问题讨论】:
-
听起来你想要一个支持有理算术的库。快速搜索会发现 github.com/tompazourek/Rationals 就是这样一个库。我认为 .NET 本身没有任何内容。
-
你考虑过在除之前乘吗?
-
你明白为什么第一个代码示例的结果是3吗?
-
10m * 3 / 3 肯定会起作用,这就是我要提出的观点。如果这还不够,请查看@JonSkeet 提供的链接。
-
the first code sample results in 3 because int cannot represent enough decimnal positions.是 - 根据*.com/questions/10851273/… 。
标签: c# decimal average division