3

我必须以字符串格式发送一个小数。字符串的最大长度为 15。如何通过四舍五入来做到这一点?

例如:

1111111111111119 = “111111111111112”

11111111111111.111 = “11111111111111”

1.11111111111119 = "1.1111111111112"

谢谢

4

3 回答 3

0

我发现了一种非常不优雅的方法,但它可以处理您的测试用例和我发现的另一个边缘案例:

static string ToStringOfMaxLength(decimal x) {

    const int maxLength = 15;

    var str = x.ToString(System.Globalization.CultureInfo.InvariantCulture);

    if(str.Length <= maxLength)
        return str;

    if(str[maxLength] == '.')
        return str.Substring(0, maxLength);
    if(str[maxLength - 1] == '.')
        return str.Substring(0, maxLength - 1);

    var digitsToDisplayExceptLast = str.Substring(0, maxLength - 1);

    var lastDigitToDisplay = CharToInt(str[maxLength - 1]);

    var firstDigitNotDisplayed = CharToInt(str[maxLength]);

    if(firstDigitNotDisplayed >= 5)
        lastDigitToDisplay++;

    return digitsToDisplayExceptLast + lastDigitToDisplay;
}

static int CharToInt(char c) {
    return (int)(c - 48);
}
于 2013-09-19T08:38:36.233 回答
0

此功能应该完全符合您的需要(在您的示例值上测试):

string ValueString15(decimal value)
{
    while (value >= 1000000000000000M)  // for your first example case
        value /= 10;
    int dotIndex = value.ToString(CultureInfo.InvariantCulture).IndexOf('.');
    value = (dotIndex >= 14) ? Math.Round(value) : Math.Round(value, 14 - dotIndex);
    return value.ToString(CultureInfo.InvariantCulture);
}

如果需要处理负值(即 value < 0),还应添加:

|| value <= -100000000000000M

到 while 条件。

于 2017-04-26T17:01:21.700 回答
-4

如果您只想将字符串剪切为 15 个字符,

decimal sample = 123456789123456789;
string result = sample.ToString().Substring(0, 15); // this cuts it to 15 characters
**returns 123456789123456**

如果你想从 15 个字符开始四舍五入。

decimal sample = 123456789123456789;
double result2 = Math.Round(sample.ToString().Substring(0, 16));
**returns 123456789123457**
于 2013-09-19T08:41:54.777 回答