【问题标题】:C# / Unity: Multiply BigInteger by FloatC# / Unity:将 BigInteger 乘以 Float
【发布时间】:2020-10-11 15:54:52
【问题描述】:

我有一个 BigInteger 成本 = 111111222222333333444444555555 和一个浮点 costMultiply 1.1f。

我尝试:

newCost = cost * costMultiply

并得到一个“无法应用运算符“*””- 错误。

我也试过了:

int multiplierBuffer = (int)(costMultiply * 10);
cost = cost * (multiplierBuffer / 10);

这不会引发错误,但会返回初始成本值(不乘以 1.1f)。

如何将我的 BigInteger 乘以浮点数?

【问题讨论】:

  • 乘以11除以10
  • costMultiply 是一个不总是 1.1f 的变量。它最终可能有不同的小数,所以我需要一个使用浮点变量而不是硬编码值的解决方案。
  • 你希望结果是什么类型的?你在那里有 30 位的精度。你都需要它们吗?如果是这样,你就会被 BigInteger 困住(浮点数给你 6-9 位,双倍 15-17 和小数 28-29,docs.microsoft.com/en-us/dotnet/csharp/language-reference/…)。编写一些代码,将浮点数转换为乘以 10 的幂和除以 10 的幂(提示,使用对数),然后这样做。
  • 我希望结果是另一个 BigInteger。在我的程序中,任何 BigInteger 都不会超过 30 位。 “将浮点数转换为乘法和除法”是什么意思?
  • 如果乘数是,例如,2.25f,找出小数点后有两位数(最简单的方法可能是有一个循环,在每次迭代中,乘以 10 和检查以确保该数字在四舍五入为 int 时足够接近)。在您的情况下,22.5 并不接近 22,但 225 有效)。所以你的乘数是 225,除数是 100。我会把它写出来并回答,但我在手机上

标签: c# unity3d biginteger bigint


【解决方案1】:

您必须将您的 BigInteger 转换为 double/Double。

    BigInteger cost = new BigInteger(10000000000000000000);
    float costMultiply = 1.1f;
    double dCost = (double) cost;
    double result = dCost * costMultiply;
    // And since you want a BigInteger at the end
    BigInteger bigIntResult = new BigInteger(result);

result 的实际类型将是 Double,因为整数无法放入 double。 C# 会为您解决这个问题。

这显然可以简化。

    BigInteger cost = new BigInteger(10000000000000000000);
    float costMultiply = 1.1f;
    BigInteger bigIntResult = new BigInteger((double) cost * costMultiply);

问题是,由于数据类型的精度水平参差不齐,您的数学将变得一团糟。如果您需要精度,我不会使用这种方法。但是,由于您想将整数乘以浮点数并得到整数结果,我想您不会被精度问题所困扰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多