我的号码是123.1234567890129。
我希望结果为123.123456789012而不会将最后一位数字舍入。
我试过了:
("123.1234567890129").ToString("G15") //123.123456789013
答案 0 :(得分:0)
你可以做到这一点的一种方法是像这样四舍五入到
onLoad
答案 1 :(得分:0)
向下舍入的扩展
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仅支持CultureInfo
和NumberFormatInfo
格式化程序。如果你传递不同的格式化程序,它将返回默认实例: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)