【问题标题】:Conversion of long to decimal in c#c#中long到十进制的转换
【发布时间】:2011-08-16 13:47:27
【问题描述】:

我有一个值存储在“long”类型的变量中。

long fileSizeInBytes = FileUploadControl.FileContent.Length;
Decimal fileSizeInMB = Convert.ToDecimal(fileSizeInBytes / (1024 * 1024));

我想将 fileSizeInBytes 转换为四舍五入到小数点后 2 位的十进制数(例如:1.74、2.45、3.51)但我无法获得所需的结果。结果我只得到一位没有小数位的数字。有人可以帮我吗??

感谢期待

【问题讨论】:

  • long 只是一个大整数,小数点后没有任何内容。举一个你得到什么和你期望什么的例子,我认为你对另一种类型很困惑。
  • @Milimetric 正如 robbrit 所建议的那样,我试图按照他的建议去做。例如,如果我将 20364702/(1024.0m * 1024.0m) 相除,这就是我得到的结果:19.4212932586669921875M 但我希望结果是 19.42。我希望将结果四舍五入到小数点后两位。我该怎么做??

标签: c# asp.net decimal type-conversion


【解决方案1】:
Decimal fileSizeInMB = Convert.ToDecimal(fileSize) / (1024.0m * 1024.0m);

您正在做的是将文件大小除以一个整数,结果是 整数,而不是小数。剩下的会被砍掉。

【讨论】:

  • @但我希望将结果四舍五入到小数位。如果我除以 20364702/(1024.0m * 1024.0m) 这就是我得到的结果:19.4212932586669921875M 但我希望结果是 19.42。我怎么能得到那个??
  • @user653622 你可以使用 Math.Round(fileSizeInMB,2) 是一种方法
  • @anishMarokey 非常感谢!!
【解决方案2】:

我没有看到 fileSize 在任何地方声明 - 但我会假设它很长。所以fileSize / (1024 * 1024) 被强制为一个不包含任何小数位的长值,所以你会得到类似的东西:

Convert.ToDecimal(someLongValue)

不会有任何小数位。先将除法转换为双精度(或其他小数),然后再将其传递给Convert.ToDecimal

【讨论】:

    【解决方案3】:

    这是我用来显示文件大小的函数

    //---------------------------------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Formats from bytes to KB,MB,GB,TB 
            /// </summary>
            /// <param name="number">Bytes to format</param>
            /// <returns></returns>
            public static string AutoFileSize(long number)
            {
                double tmp = number;
                string suffix = " B ";
                if (tmp > 1024) { tmp = tmp / 1024; suffix = " KB"; }
                if (tmp > 1024) { tmp = tmp / 1024; suffix = " MB"; }
                if (tmp > 1024) { tmp = tmp / 1024; suffix = " GB"; }
                if (tmp > 1024) { tmp = tmp / 1024; suffix = " TB"; }
                return tmp.ToString("n") + suffix;
            }
    

    【讨论】:

      【解决方案4】:

      可能有点晚了,但在这里您或多或少拥有文件大小瓦等所需的一切

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Globalization;
      using System.Runtime.InteropServices;
      using System.Threading;
      
      namespace ConsoleApplication1
      { 
      
          class Program
          {
      
              /// <summary>
              /// Formats the given size to the order of magniture given
              /// Order is 1 for KB, 2 for MB etc up to 8, after that you get exponents for the same notations
              /// </summary>
              /// <param name="size">The total size in bytes</param>
              /// <param name="order">+1 for each 1024 B,M,... 0 for nothing</param>
              /// <param name="unit">Usually you will want B for bytes denotation, but maybe "bit" or "bi" or W for watt</param>
              /// <param name="decimal_places">Number of desired decimal places</param>
              /// <param name="add_space">Separate KB MB etc from the number with a space?</param>
              /// <returns>Formatted size</returns>
              public static string FormatSize(string unit, double size, int order, int decimal_places, bool add_space) {
      
                  string[] suffixes = new string[] {"", "K","M","G","T","P","E","Z","Y"};
      
                  int exponent = order - 8 > 0 ? order - 8 : 0;
                  order -= exponent;
      
                  string suffix = suffixes[order];
      
                  while (order > 0) {
                      size /= 1024;
                      order--;
                  }
      
                  string sDecimals = new String('0', decimal_places);
                  string sExponent = exponent != 0 ? "E" + exponent : "";
                  string dot = decimal_places > 0 ? "." : "";
      
                  return size.ToString("#,##0" + dot + sDecimals + sExponent) + (add_space ? " " : "") + suffix + unit;
              }
      
              public static void Main(string[] Args)
              {
                  Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
      
                  string sz;
                  sz = FormatSize("B", 1024, 1, 0, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("B", 1024*1024 + 512, 1, 0, true);
                  Console.WriteLine(sz);
                  sz = FormatSize("W", 1024 * 1024 + 512, 1, 2, true);
                  Console.WriteLine(sz);
                  sz = FormatSize("B", 1024 * 1024 + 512, 2, 2, true);
                  Console.WriteLine(sz);
                  sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2, 3, 0, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("bit", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2, 3, 1, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 1, 3, 2, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("Ω", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 1, 3, 1, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 10000000, 3, 2, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 1, 3, 0, false);
                  Console.WriteLine(sz);
                  sz = FormatSize("bit", 1208925819614629174706176f, 9, 2, true);
                  Console.WriteLine(sz);
              }
          }
      }
      

      这是一些输出:

      1KB
      1,025 KB
      1,024.50 KW
      1.00 MB
      2GB
      1.5Gbit
      1.50GB
      1.5GΩ
      1.49GB
      1GB
      1.00E1 Ybit
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-01
        • 2011-02-04
        • 1970-01-01
        • 2015-12-18
        • 2019-04-09
        • 1970-01-01
        相关资源
        最近更新 更多