C#decimal type存在这个问题:
Console.WriteLine( 1m/3 + 1m/3 == 2m/3 );
False
它只能在除以2或5时精确表示数字,否则结果可能是repeating decimal number。
正如在(C# Rational arithmetic)之前的Stack Overflow上所提到的,实现存储两个小数,分子和分母,并且完全执行乘法和除法的东西是非常有可能的。它可以在需要时使用Euclid算法简化分数。还应实现一些显式转换为double或decimal。
有一些合理的商数实现呈现here和here。还有一个Microsoft Solver Foundation结构Rational。
如何实现C#中的decimal
,是否可以复制此实现并修改它以处理重复 decimal
?
答案 0 :(得分:9)
decimal
实现为有效数,符号和指数,基本上是一个浮点数,其中“点”是小数点而不是二进制点(根据float
和{{ 1}})。有关详细信息,请参阅我的article on the topic。 (请注意,与double
和float
不同,double
未规范化 - 因此它会保留尾随无关紧要的零值。)
如果您想创建自己的decimal
类型,可以这样做,但是您不希望从源代码开始RationalNumber
- 并且您将无法更改decimal
的含义也意味着你的类型。