如何克服丢失的便士?

Tar*_*rik 6 .net currency

我将为一家他们为金融机构编程的公司工作,我将会花很多钱.在此之前,这对我来说并不是一个主要问题,因为我一直在做小钱的事情而且Double在某些时候已经足够了,但现在即使是1便士也很重要.

我想每个人都可能知道

Dim mValue as Decimal = 100 'seems the best type for now
mValue = mValue / 3
Console.WriteLine(mValue)
Console.ReadLine()

mValue = mValue * 3
Console.WriteLine(mValue)
'Outputs 99.9999999999999999999999999... and never hits 100
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能克服这个问题并找到更好的精确结果呢?

谢谢.

Jon*_*eet 5

如果你需要能够执行任意分割,听起来你需要一个有理数的表示(一个分数).我不相信.NET会默认提供一个,并且你将会以一种与内置数字类型一样的方式实现它.这可能会让你进行加法,减法,乘法和除法 - 但如果你也需要无理数(例如取平方根),它就无济于事.

确定你要除以3吗?你确定你不能舍入(比如)最接近的一分钱1000?你应该找出你的计算的确切要求 - 我怀疑你真的需要无限精确.


Joe*_*oel 2

我不是这个领域的专家,所以有更多经验的人可能会更好地回答这个问题。

您可以相当安全地舍入到 10000 位左右的数字,然后在需要使用该数字时舍入到最接近的便士。这适用于您发布的示例

100/ 3 = 33.333333333333333 * 3 = 99.99999999999,然后四舍五入为 100。

我知道很多事情都使用所谓的银行家四舍五入。这是为了防止以 5 结尾时赔钱。如果 5 之前的数字是奇数,则向上舍入;如果数字是偶数,则向下舍入。需要考虑的事情。

http://en.wikipedia.org/wiki/Rounding