如何将double转换为15位数的字符串?

时间:2016-10-14 14:58:08

标签: c# .net

我的号码是123.1234567890129。

我希望结果为123.123456789012而不会将最后一位数字舍入。

我试过了:

("123.1234567890129").ToString("G15") //123.123456789013

5 个答案:

答案 0 :(得分:0)

你可以做到这一点的一种方法是像这样四舍五入到

onLoad

答案 1 :(得分:0)

  1. 既然你说了两倍。
  2. 由于双打可以包含任意数量的数字,因此您必须以某种方式进行舍入。 (你要么向下舍入,要么推断,要么就像在这种情况下的实践一样)
  3. 由于您暗示您只想查看精确数字的位数,您必须找出小数点两边各有多少位数(两边各为0到15)
  4. 向下舍入的扩展

    public static class DoubleExtensions
    {
        public static double RoundDown(this double value, int numDigits)
        {
            double factoral = Math.Pow(10, numDigits);
            return Math.Truncate(value * factoral) / factoral;
        }
    }
    

    测试用例

            const int totalDigits = 15;
    
            // why start with a string??
            string somestring = "123.1234567890129";
            const int totalDigits = 15;
    
            // since the title says 'convert a double to a string' lets make it a double eh?
            double d = double.Parse(somestring);
            int value = (int)d;
    
            double digitsRight = d - value;
            int numLeft = (d - digitsRight).ToString().Count();
            int numRight = totalDigits - numLeft;
    
            double truncated = d.RoundDown(numRight);
    
            string s = truncated.ToString("g15");
    

答案 2 :(得分:0)

您可以创建自定义FormatProvider,然后创建您的实现。

class Program
{
    static void Main(string[] args)
    {
        double number = 123.1234567890129;

        var result = string.Format(new CustomFormatProvider(15), "{0}", number);
    }

}


public class CustomFormatProvider : IFormatProvider, ICustomFormatter
{
    private readonly int _numberOfDigits;

    public CustomFormatProvider(int numberOfDigits)
    {
        _numberOfDigits = numberOfDigits;
    }

    public object GetFormat(Type formatType) => formatType == typeof(ICustomFormatter) ? this : null;

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (!Equals(formatProvider))
            return null;

        if (!(arg is double))
        {
            return null;
        }

        var input = ((double)arg).ToString("R");

        return input.Length > _numberOfDigits + 1 ? input.Substring(0, _numberOfDigits + 1) : input; // +1 because of dot
    }

不幸的是你不能这样做:

var result = number.ToString(new CustomFormatProvider(15));

因为值类型限制.. Double仅支持CultureInfoNumberFormatInfo格式化程序。如果你传递不同的格式化程序,它将返回默认实例:NumberFormatInfo.CurrentInfo'. You can make small workaround by using string.Format`方法。

答案 3 :(得分:0)

社区新手。这是第一个答案。 :)

我认为你正在寻找这样的东西。使用或不使用小数。这将仅在第15位后切数字,而与数字的长度无关。您可以通过将精度值作为用户输入并相应地执行该条件检查来让用户决定准确性。我用了15,因为你提到了它。请让我知道这对你有没有用。干杯!

        string newstr;
        int strlength,substrval;
        double number;
        string strnum = "123.1234567890129";
        strlength = strnum.Length;
        if(strlength>15)
        {
            strlength = 15;
        }
        substrval = strlength;
        foreach(char x in strnum)
        {
            if(x=='.')
            {
                substrval++;
            }
        }
        newstr = strnum.Substring(0, substrval);
        number=Convert.ToDouble(newstr);

答案 4 :(得分:-2)

Alife Goodacre, code is printing "123.12345678901" insted "123.123456789012"

应该有子串(0,15)的子串(0,16)

Convert.ToDouble("123.1234567890129").ToString("G16").Substring(0, 16)

带代码的OutPut屏幕。

enter image description here