【问题标题】:why does toString() cause my string to lose a decimal place?为什么 toString() 会导致我的字符串丢失小数位?
【发布时间】:2017-05-01 04:19:51
【问题描述】:

为了向前,我的 .net 和 c# 经验非常有限,有人可以说我是一个完全的菜鸟 :) 但是我确实掌握了一些 OOP,因为我通常使用 PHP (FWIW) 工作。

我的问题似乎与这一行有关:

Session["total"] = dt.Compute("SUM(price)", "").ToString();

这将输出总共说“9.2”,其中价格是“9.20”,从几行这样的记录:

dt.Rows.Add(strRecord, 9.20, dropDownListDistrict_stepTitle.Text);

因此 9.20 + 9.20 = "18.40",但页面显示 "18.4"。

显示总和的标签是:

<asp:Label ID="labelTotal3" runat="server" Text="0" />

根据我收集到的信息,我遇到了某种类型转换问题?

希望我没有遗漏任何内容,显示所有代码有点困难,但希望有人能指出我正确的方向?

问题是;我怎样才能得到一个额外的小数位来显示我的总和(或者为什么它会去掉最后一个小数位?)。

TIA 贾里德

【问题讨论】:

  • 感谢所有有用的答案!我尝试了“N2”(和“n2”),但我得到“toString() 的无重载方法需要 1 个争论”错误。我也试过 string.Format("{0:C0}", labelTotal3.Text);以及格式化字符串的多种变体,但似乎没有任何改变。我需要写一个toString的重载方法吗? :(
  • DataTable.Compute() 返回一个对象。您可能应该将其转换为双倍,然后尝试 ToString。试试 Session["total"] = ((double)dt.Compute("SUM(price)", "")).ToString();
  • 我刚刚尝试过,它给了我一个堆栈错误,所以我尝试将 dt.rows.add 强制转换为 double 并且没有任何区别。嗯:/

标签: c# asp.net


【解决方案1】:

试试.ToString("N2")

【讨论】:

    【解决方案2】:

    因此 9.20 + 9.20 = “18.40”,但页面显示“18.4”。

    18.4 = 18.40。尾随零对数字没有任何意义,因此除非您要求打印它们,否则它们不会。请参阅String Format for Double,了解根据您的要求设置数字格式的不同方式。

    【讨论】:

      【解决方案3】:

      你对问题的评价不正确

      9.20 + 9.20 = 18.4(后面的零将被丢弃) 因此显示将自动为“18.4”

      试试这样的

      string.Format("{0:C0}", myNumber)
      

      您还可以使用以下函数(对不起,它是在 VB 中)来非常花哨地换出货币符号、添加/删除小数位数等。这里的想法不是它总是适用的,而是如果您正在寻找更大的灵活性,它只是另一种选择。

      Public Shared Function CustomFormatCurrency(ByVal input As Decimal) As String 
          Dim nfi As System.Globalization.NumberFormatInfo = New System.Globalization.NumberFormatInfo  
          nfi.CurrencyDecimalDigits = 0  
          nfi.CurrencySymbol = "$" 
          Return String.Format(nfi, "{0:C}", input)  
      End Function 
      

      【讨论】:

      • @BoltClock ...对于0的非常小的值...但除此之外,我认为rockinthesixstring试图说明的是:字符串不是数字,只是可打印的表示它。
      • 数字后面的零是没有意义的,所以如果数字后面有零,就会被丢弃。
      • @rockinthesixstring:这就是我所说的。
      • 对不起,如果这是一个愚蠢的问题或者我无法理解(数学也不是我的强项哈!)但是为什么字符串会丢失最后一个小数位?我可以理解它是否正在打印整数答案,但它只是一个字符串?我猜即使结果是字符串,转换也会降低小数位?我在这里有意义吗? :P
      • 这是计算值的字符串表示形式。零是在转换为字符串之前从值中删除。
      【解决方案4】:

      什么都没有真正丢失,因为 18.4 与 18.40 完全相同(对于计算机来说,就是......)。要修复它,您需要指定格式:

      .ToString("n2");
      

      这会将您的值格式化为小数点右侧 2 位的数字

      【讨论】:

        【解决方案5】:

        试试ToString("##,#.##")string.Format("{0:##,#.##}")

        【讨论】:

          【解决方案6】:

          你想要:

          String.Format("{0:0.0}", 9.2);   //9.2
          String.Format("{0:0.00}", 9.2);  //9.20
          String.Format("{0:0.000}", 9.2); //9.200
          

          【讨论】:

            【解决方案7】:

            我发现在类之间传递变量的实例中,在 ToString 之前,有可能存在损失并且 ToString 是准确的,因为它通常是准确的,例如,如果您想测试它的准确性,只需除以 10乘以 3 和 ToString ,它将带来重复的小数位。下面是我遇到的类似问题的示例以及我是如何解决它的,尽管我怀疑我的方法更巧妙。

            例子

            class MyDecimal
            {
             public decimal Number = 138 / 10;
            }
            

            在其他地方做

            MyDecimal ThisDec = new MyDecimal();
            public decimal ThirdPlaceIsNoGone = ThisDec.Number / 100;
            

            我最终不是在收集小数后除以 100,而是需要除以 1000,问题看起来是 ToString 正在删除第 3 位小数,但实际上它并没有被拉到类之间开始与

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-10-22
              • 1970-01-01
              • 2022-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多