【问题标题】:long real arithmetics C#长实数算术 C#
【发布时间】:2014-04-05 11:42:34
【问题描述】:

我需要使用逗号前 8 位和逗号后 8 位的数字进行操作,例如12345678,12345678

如何在不损失精度的情况下执行除法、乘法和求和运算,并且我想执行快速计算。

你有什么建议?我在 Visual Studio 2013 中工作,C#。

【问题讨论】:

  • 一个long似乎符合你的要求...它的范围是–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807,也就是19位...
  • 如果您将两个小数点前 8 位和小数点后 8 位的数字相乘,您的结果(不损失“准确性”,无论在您的上下文中意味着什么)是 16 + 16 位。至于除法 - 你会几乎总是失去准确性(想想 1.0 / 3.0)。您必须定义您愿意在最终结果中接受的准确度。使用double,您将获得 15 位数字 - 但如果您的系统有 long double(128 位),那么您就可以使用了。根据msdn.microsoft.com/en-us/library/9cx8xs15.aspx - VS2013 实现了 80 位 long double
  • 好吧,我需要如果我得到像 0,000000001 这样的数字,那么它将被舍入到 0,00000001(到逗号后有 8 位数字并且大于结果的最接近的数字)所以 1.0/3.0 =0.33333334 Long Double 不够,我需要可以存储 8 个十进制数字的东西。
  • System.Decimal 可以轻松搞定,精确到 28 位有效数字。

标签: c# visual-studio-2013 bignum


【解决方案1】:

.NET 有一个数据类型可以做你想做的事 - System.Decimal,在 C# 中缩写为 decimal

decimal 关键字表示 128 位数据类型。与浮点类型相比,十进制类型的精度更高,范围更小,适用于金融和货币计算。

它支持的数字范围在负数和正数 79,228,162,514,264,337,593,543,950,335 之间,并且支持 28-29 位有效数字。此外,它还支持开箱即用的所有常规数值运算(除法、乘法等)。

【讨论】:

    【解决方案2】:

    我决定使用 BigInteger 类型并将逗号后的整数存储在单独的整数中。

    BigInteger number1= new BigInteger(52793562305619195816059);
    int amount1=10;
    BigInteger number2=new BigInteger(568416843186432156843521);
    int amount2=10;
    BigInteger result=BugInteger.Mul(number1,numner2);
    BigInteger remainder;
    result=Biginteger.DivRem(result,amount1*amount2,remainder);
    if (remainder>0)
    result++;
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 2017-10-27
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2015-10-05
      • 2012-07-27
      相关资源
      最近更新 更多