【问题标题】:Long to decimal with decimal point at a specific position长到小数,小数点在特定位置
【发布时间】:2014-09-21 04:51:08
【问题描述】:

在 C# 中,我需要将 long 转换为小数。问题是我想将小数点放在 long 中的特定位置。

例如,假设我有以下长数字:

long l = 123456789

当转换为浮点数在第三位的小数时,我想要以下内容:

decimal d = 123456.789

举个例子,这个函数最好是类似于 Java 中的 BigDecimal.valueOf,它允许你给出一个 long 和一个放置小数点的位置,它会返回正确的值。

我知道其中一种解决方案是将 long 格式化为具有正确小数点位置的字符串,然后将其转换回小数。另一种解决方案是将 long 乘以 10-想要的小数位数,但我想知道是否有更好的替代方案。

【问题讨论】:

标签: c# decimal long-integer bigdecimal decimal-point


【解决方案1】:

为什么不除以 1000(或 10^N,其中 N 是小数位数)?

【讨论】:

  • 这就是我提问的目的。我想知道是否有一个类似于 BigDecimal.valueOf 的 C# 函数,它允许您在无需进行此类计算的情况下对其进行转换。
  • 显然,即使获取节的工作量更大,Decimal 构造函数也可以完成这种工作:msdn.microsoft.com/en-us/library/bb1c1a6x%28v=vs.110%29.aspx
【解决方案2】:
long l = 123456789L;
int decplaces = 3;

decimal divisor =(decimal) Math.Pow(10, decplaces);
decimal d = l/divisor;

【讨论】:

  • 如果decplaces 类似于25,则可能不准确。或者,转换为decimal 的奇怪规则可能会拯救你?
  • 当 int decplace = 25; d= 0.0000000000000000123456789(LinqPad 非常方便)
  • 它仍然适用于 decplaces = 28,但在 29 时,它会抛出一个异常,说它对于小数来说太小了。
  • 我在考虑 Math.Pow(10, 25) 返回一个 double 其内部值不能完全是 1E+25 的事实。它将改为1.0000000000000000905969664E+25。然后人们可能会担心相应的小数会变成10000000000000000905969664m。但它实际上通过某种魔法变成了10000000000000000000000000m。所以我认为你的方法毕竟是准确的。
【解决方案3】:

您可以使用采用不同组成部分的Decimal constructor。您需要进行一些位移才能使指数进入所有相关部分,但这应该不会太难。如果您知道您的值不会超过 62 位,那也会使事情变得更容易。

【讨论】:

    【解决方案4】:

    您可以编写一个循环来乘以0.1m 正确的次数,即numberOfDecimalPlacesWanted 循环的迭代次数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2018-05-30
      • 1970-01-01
      • 2022-06-23
      • 2021-09-19
      • 2018-12-21
      相关资源
      最近更新 更多