我有一个数字(只是一个例子:
"3616,946489653802082229919075063226"
存储在string
中。我想将其转换为decimal
,但得到一个 OverflowException ,因为该值对于十进制而言太长了。
我想先对string
进行四舍五入,然后再将其转换为来解决错误。
我该怎么做?
答案 0 :(得分:6)
解析是特定于文化的。因此,
可以是小数或千位分隔符。如果,
是千位分隔符,则会被忽略:
"3616,946489653802082229919075063226" -> 3616946489653802082229919075063226m
该值超过decimal.MaxValue
,因此您抛出了异常。
如果将,
视为小数点分隔符,请让系统知道:
decimal result = decimal.Parse(source,
new NumberFormatInfo() { NumberDecimalSeparator = ","});
您将获得3616.9464896538020822299190751m
答案 1 :(得分:2)
您的问题实际上不是舍入问题,它试图在系统上使用逗号来解析小数,该系统默认情况下希望将点作为小数分隔符。
您可以尝试执行此操作,以确保在所有环境中都可以对其进行正确解析:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
var input = "3616,946489653802082229919075063226";
var result = decimal.Parse(input, new NumberFormatInfo() { NumberDecimalSeparator = ","});
Console.WriteLine(result);
}
}
答案 2 :(得分:0)
使用格式将任意单位的小数部分与小数部分隔开的小数位数给出,您可以通过以下操作来解决:
class Program
{
static void Main(string[] args)
{
var decimalPlacesCount = 10;
var decimalSeparator = ',';
var parts = "3616,946489653802082229919075063226".Split(decimalSeparator);
var value = decimal.Parse(parts[0]);
if (parts.Length == 2)
{
value += decimal.Parse($"0.{parts[1].Substring(0, decimalPlacesCount)}");
}
Console.WriteLine(value);
}
}
这有效地将其四舍五入为小数位数。
答案 3 :(得分:0)
尽管如果有人碰巧遇到了这个有名的问题,而不是寻找一种希望实际上能够将字符串四舍五入的方法,这不是您的问题,
public static string RoundString(string value, int decimalPlaces)
{
StringBuilder returnValue = new StringBuilder(value);
int startIndex = 0;
int charIndex = 0;
while (charIndex < value.Length && startIndex == 0)
{
if (value[charIndex].ToString() == ".")
startIndex = charIndex + 1;
charIndex++;
}
if (int.Parse(value[charIndex + decimalPlaces + 1].ToString()) >= 5)
{
bool rounded = false;
for (charIndex = startIndex + decimalPlaces; charIndex > -1; charIndex--)
{
if (!rounded && charIndex != startIndex-1)
{
int newVal = int.Parse(returnValue[charIndex].ToString()) + 1;
if (newVal > 9)
{
returnValue[charIndex] = '0';
}
else
{
returnValue[charIndex] = (int.Parse(returnValue[charIndex].ToString()) + 1).ToString()[0];
rounded = true;
}
}
}
if (!rounded)
{
startIndex++;
returnValue = new StringBuilder("1" + returnValue.ToString());
}
}
return returnValue.ToString().Substring(0, startIndex + decimalPlaces);
}
这本书写得很差,我敢肯定有人可以做得更好,但是确实可以。例如,StringBuilder很伪劣,可以使其运行得更快。
此外,我对实际的输入字符串进行了0验证。