// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
public static class PrecisionHelper
{
public static decimal TwoDecimalPlaces(this decimal value)
{
// These first lines eliminate all digits past two places.
var timesHundred = (int) (value * 100);
var removeZeroes = timesHundred / 100m;
// In this implementation, I don't want to alter the underlying
// value. As such, if it needs greater precision to stay unaltered,
// I return it.
if (removeZeroes != value)
return value;
// Addition and subtraction can reliably change precision.
// For two decimal values A and B, (A + B) will have at least as
// many digits past the decimal point as A or B.
return removeZeroes + 0.01m - 0.01m;
}
}
一个示例单元测试:
[Test]
public void PrecisionExampleUnitTest()
{
decimal a = 500m;
decimal b = 99.99m;
decimal c = 123.4m;
decimal d = 10101.1000000m;
decimal e = 908.7650m
Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("500.00"));
Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("99.99"));
Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("123.40"));
Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("10101.10"));
// In this particular implementation, values that can't be expressed in
// two decimal places are unaltered, so this remains as-is.
Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("908.7650"));
}
15 回答
给定 decimal d=12.345; 表达式 d.ToString("C") 或 String.Format("{0:C}", d) 产生 $12.35 - 请注意使用当前文化的货币设置,包括符号 .
请注意"C"使用当前文化中的位数 . 您始终可以使用
C{Precision specifier}
(例如String.Format("{0:C2}", 5.123d)
)覆盖默认值以强制必要的精度 .您可以使用system.globalization格式化任何所需格式的数字 .
For example:
如果你有一个
decimal d = 1.2300000
并且需要将其修剪为2位小数,那么它可以像这样打印d.Tostring("F2",ci);
,其中F2是字符串格式化为2位小数,ci是locale或cultureinfo .有关更多信息,请查看此链接
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
此链接详细说明了如何处理您的问题以及如果您想了解更多信息可以执行的操作 . 为简单起见,您要做的是
如果您想要这种货币,可以通过输入“C2”而不是“F2”来简化
如果你想用逗号和小数点(但没有货币符号)格式化,例如3,456,789.12 ......
已经有两个高得分的答案引用了Decimal.Round(...),但我认为需要更多的解释 - 因为Decimal的一个意想不到的重要属性并不明显 .
小数'根据它来自何处'知道它有多少小数位 .
例如,以下可能是意外的:
使用
Double
执行相同的操作将不会为上述每个操作提供小数位("25"
) .当你想要一个十进制到2位小数时,它有大约95%的可能性,因为它是货币,在这种情况下这可能在95%的时间内正常:
或者在XAML中你只需使用
{Binding Price, StringFormat=c}
我遇到的一个案例是,当我向亚马逊的web服务发送XML时,我需要一个十进制小数 . 该服务抱怨,因为十进制值(最初来自SQL Server)被发送为
25.1200
并被拒绝,(25.12
是预期的格式) .我需要做的只是
Decimal.Round(...)
,有2个小数位来解决问题 .TypedValue
的类型为Decimal
所以我不能只做ToString("N2")
并需要将其舍入并保持为decimal
.Mike M.'s answer对我来说非常适合.NET,但.NET Core在撰写本文时没有
decimal.Round
方法 .在.NET Core中,我不得不使用:
一个hacky方法,包括转换为字符串,是:
如果你只是需要这个用于显示使用string.Format
http://www.csharp-examples.net/string-format-double/
“m”是十进制后缀 . 关于十进制后缀:
http://msdn.microsoft.com/en-us/library/364x0z75.aspx
我知道这是一个古老的问题,但我很惊讶地看到似乎没有人发布答案;
没有使用银行家四舍五入
未将值保留为小数 .
这是我会用的:
http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx
评价最高的答案描述了格式化十进制值的字符串表示的方法,并且它可以工作 .
但是,如果您确实要将保存的精度更改为实际值,则需要编写如下内容:
一个示例单元测试:
这将:
舍入到2位小数,例如 . 23.456 => 23.46
确保总有2个小数位,例如 . 23 => 23.00,12.5 => 12.50
非常适合货币和显示货币金额 .
有关ToString("F")的文档:http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString(感谢Jon Schneider)
要么
这是一个显示不同格式的Linqpad程序:
结果如下:
如果值为0,您很少需要空字符串 .
评分最高的答案不正确,浪费了10分钟(大多数)人的时间 .
这些都没有完全符合我的要求,强制 2 d.p. 并向上舍入
0.005 -> 0.01
强迫2 d.p.需要将精度提高2 d.p.确保我们至少有2个d.p.
然后四舍五入以确保我们没有超过2 d.p.
Math.Round Method (Decimal, Int32)