C# 乘法时如何只返回两个小数?

C# 乘法时如何只返回两个小数?,c#,linq-to-sql,decimal,C#,Linq To Sql,Decimal,我必须乘以两个十进制数:6,0*5,50,结果是:33000 如何从结果中删除最后一个0?我希望得到33,00作为结果 要进行乘法运算,我使用以下查询: var rr = (from s in baza.customer where userID == s.userID && s.data.Month == dat select s.hours * s.prise.Sum(); 您有一个字符集问题。您的代码正在北美地区

我必须乘以两个十进制数:
6,0*5,50
,结果是:
33000

如何从结果中删除最后一个
0
?我希望得到
33,00
作为结果

要进行乘法运算,我使用以下查询:

var rr = (from s in baza.customer
          where userID == s.userID
          && s.data.Month == dat
          select s.hours * s.prise.Sum();

您有一个字符集问题。您的代码正在北美地区运行,其中
是千位分隔符(而
是十进制标记)。

您遇到了字符集问题。您的代码正在北美地区运行,其中
是千位分隔符(并且
是十进制标记)。

尝试使用字符串格式:
string.Format(“{0:0.##}”,number)
尝试使用字符串格式:
string.Format(“{0:0.###}”,number)

为什么不在输出时格式化值,而不是在计算时尝试减少小数

使用


在输出中只有小数

为什么不在输出时格式化值,而不是在计算时尝试减少小数点

使用


在输出中只有小数

假设希望以字符串形式表示,则需要使用。例如,对您发布的值(33.000)进行快速测试后,代码
(33.000).ToString(“f”)
给出的结果为33.00


注意:“f”可能不是您需要的实际格式说明符-最好先阅读我链接的文章。

如果您希望以字符串形式表示,则需要使用。例如,对您发布的值(33.000)进行快速测试后,代码
(33.000).ToString(“f”)
给出的结果为33.00


注意:“f”可能不是您需要的实际格式说明符-最好先通读我链接的文章。

由于这里似乎有些混乱,我将向另外两个发布一个类似的答案,但用一个简短但完整的程序来说明为什么需要它

首先,需要澄清的是(如评论中所示),这是将两个小于10的数字相乘——作为C#文字,它们分别为6.0m和5.50m。它们是
decimal
值这一事实也是高度相关的-因为
decimal
保持尾随零,而
double
不保持尾随零。因此:

// Note: my system is in en-gb
using System;

class Test
{
    static void Main()
    {
        decimal x = 6.0m;
        decimal y = 5.50m;
        decimal z = x * y;
        Console.WriteLine(z); // Prints 33.000
        Console.WriteLine(z.ToString("0.00")); // Prints 33.00
        // Same with composite formatting
        Console.WriteLine("{0:0.00}", z); // Still prints 33.00
        // If you want fewer than 2 decimal digits when they're
        // not necessary
        Console.WriteLine(z.ToString("0.##")); // Prints 33
    }
}
如果当前线程的区域性使用
,“
而不是
”,“
作为十进制分隔符,那么显然您将得到“33,00”

如果要将实际值四舍五入到小数点后2位,可以使用以下方法:

当然,这可能会丢失重要信息


请注意,通常只有在向用户呈现信息时才应用字符串格式。

由于这里似乎有一些混淆,我将向另外两个发布类似的答案,但用一个简短但完整的程序来说明为什么有必要这样做

首先,需要澄清的是(如评论中所示),这是将两个小于10的数字相乘——作为C#文字,它们分别为6.0m和5.50m。它们是
decimal
值这一事实也是高度相关的-因为
decimal
保持尾随零,而
double
不保持尾随零。因此:

// Note: my system is in en-gb
using System;

class Test
{
    static void Main()
    {
        decimal x = 6.0m;
        decimal y = 5.50m;
        decimal z = x * y;
        Console.WriteLine(z); // Prints 33.000
        Console.WriteLine(z.ToString("0.00")); // Prints 33.00
        // Same with composite formatting
        Console.WriteLine("{0:0.00}", z); // Still prints 33.00
        // If you want fewer than 2 decimal digits when they're
        // not necessary
        Console.WriteLine(z.ToString("0.##")); // Prints 33
    }
}
如果当前线程的区域性使用
,“
而不是
”,“
作为十进制分隔符,那么显然您将得到“33,00”

如果要将实际值四舍五入到小数点后2位,可以使用以下方法:

当然,这可能会丢失重要信息


请注意,您通常只应在向用户显示信息时应用字符串格式。

实际上,这不应该只返回33,或者您是否希望返回2位小数。您可以使用string.format对输出进行任意格式设置!或者我可能不理解你的问题:-?如果你能澄清你的数字是“6”和“5.5”还是“60”和“550”会有帮助。@user1031034 s.hours和s.prise的声明类型是什么?另外,您是否在调试器中确认值实际上是6和5+1/2?有可能在某个点对值进行了错误的分析。还有,你从哪里得到“33000”的结果?您的代码完全没有显示格式。您能运行这个--
Console.WriteLine(CultureInfo.CurrentCulture)吗--并将输出放入您的问题中?实际上,这不应该只返回33,还是您希望返回2个小数点位?您可以使用String.format对输出进行任意格式化!或者我可能不理解你的问题:-?如果你能澄清你的数字是“6”和“5.5”还是“60”和“550”会有帮助。@user1031034 s.hours和s.prise的声明类型是什么?另外,您是否在调试器中确认值实际上是6和5+1/2?有可能在某个点对值进行了错误的分析。还有,你从哪里得到“33000”的结果?您的代码完全没有显示格式。您能运行这个--
Console.WriteLine(CultureInfo.CurrentCulture)吗--然后将输出放入您的问题中?它也可以是英国语言环境,或者几乎任何其他英语语言环境。它与十进制分隔符无关。如果是这样,他就不会得到答案了。这看起来像是System.Decimal的一个重要数字问题。@JoeWhite六十乘以五百五十确实是三万三千,而六乘以五点五等于三十三。所以它实际上可能是一个十进制分隔符问题。@phoog:不太可能-因为“60”的格式不太可能是“6,0”。这对要求的结果也毫无意义——为什么OP想要实际结果的十分之一?我认为这个答案与真正的问题无关。@JonSkeet我的(en-US)机器
String.Format("{0:0.00}", number)
// Note: my system is in en-gb
using System;

class Test
{
    static void Main()
    {
        decimal x = 6.0m;
        decimal y = 5.50m;
        decimal z = x * y;
        Console.WriteLine(z); // Prints 33.000
        Console.WriteLine(z.ToString("0.00")); // Prints 33.00
        // Same with composite formatting
        Console.WriteLine("{0:0.00}", z); // Still prints 33.00
        // If you want fewer than 2 decimal digits when they're
        // not necessary
        Console.WriteLine(z.ToString("0.##")); // Prints 33
    }
}
decimal rounded = decimal.Round(z, 2);