C# 十进制类型存在此问题:
Console.WriteLine( 1m/3 + 1m/3 == 2m/3 );
False
它只能在除以 2 或 5 时精确地表示数字,否则结果可能是重复的十进制数。
正如前面的堆栈溢出(C# 有理算术)中提到的,实现存储两个小数、分子和分母的东西,并完全执行乘法和除法是很有可能的。它可以在需要时使用欧几里得算法简化分数。还应实现对双精度或十进制的一些显式转换。
这里和这里提供了一些有理商实现。还有一个Microsoft求解器基础结构 Rational。
如何在 C# 中实现decimal
,是否可以复制此实现并对其进行修改以处理重复decimal
?
这里有一些与重复小数相关的试验,SO答案中出现在这里和这里
decimal
实现为有效数、符号和指数,基本上 - 浮点数,其中"点"是小数点而不是二进制点(根据 float
和 double
)。有关更多详细信息,请参阅我关于该主题的文章。(请注意,与 float
和 double
不同,decimal
没有规范化 - 例如,它将保留尾随的无关紧要的零。
如果你想创建自己的RationalNumber
类型,你可以这样做,但你不想从源代码开始decimal
- 你也无法将decimal
的含义更改为表示你的类型。