存储无限小数c#
本文关键字:小数 无限 存储 | 更新日期: 2023-09-27 18:17:02
我需要用分数做一些计算,结果有无限小数。例如:
240/360=0.666666...
输出有无限个小数,当我将它乘以一个整数时,结果一定是一个整数。所以我这样编码:
result = someInteger * decimal.divide(240/360);
(Try with someInteger = 2,700)但是结果是十进制值,一些计算器甚至电子表格会输出整数结果。如何在c#中获得相同的结果?
谢谢
输出有无限个小数,当我将它乘以一个整数时,结果一定是一个整数。
那不会真的发生。
你能做的是小心地四舍五入(在乘法之后)。
或者代替
result = someInteger * decimal.divide(240/360);
可以用
result = someInteger * 240 / 360;
有什么问题吗?
当你非常认真地处理分数并且保持的精度时,你需要一个特殊的类型:
struct Rational
{
public readonly int Numerator;
public readonly int Denominator;
// lots of members, including operators
}
有一些库和示例说明如何做到这一点。
但请注意,您仍然无法表示π没错。
你可以将分子和分母分别存储为整数,在除法之前先将分子相乘,但这并不能解决所有问题,因为1/3 * 2仍然会得到一个无限小数。这也只适用于有理数
use Math.Round()
result = someInteger * decimal.divide(240/360);
result = Math.Round(result);
返回一个整数是你要求做的,对吗?
许多应用程序通过进行中间计算来执行伪分数数学,其精度高于最终需要/输出给用户的精度(Office就是这样做的)。如果这不是您想要的,并且您想要执行真正的分数数学,那么请搜索分数实现。这里似乎有一个不错的实现。这种实现的问题在于,责任在于功能的正确性,而不是效率。因此,如果您的应用程序需要执行数以百万计的分数操作,那么它的性能可能会受到影响。