String.format 方法小数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String.format 方法小数问题相关的知识,希望对你有一定的参考价值。

double h = 45612645464645642d;
String strD = String.format("%f", h);
System.out.println("strD==="+strD);

(1)如果h没有小数的话,为什么他默认的是六位小数;结果是:45612645464645642.000000

那位大侠给我解释下;

你用了String.format("%f", h)格式转换
浮点数的默认格式就是带6个小数点的
参考技术A 转换方式:
'e', 'E' -- 结果被格式化为用计算机科学记数法表示的十进制数
'f' -- 结果被格式化为十进制普通表示方式
'g', 'G' -- 根据具体情况,自动选择用普通表示方式还是科学计数法方式
'a', 'A' -- 结果被格式化为带有效位数和指数的十六进制浮点数

例如:
float f = 10f;
System.out.println(String.format("%e", f));
System.out.println(String.format("%f", f));
System.out.println(String.format("%g", f));
System.out.println(String.format("%a", f));

输出结果是:
1.000000e+01
10.000000
10.0000
0x1.4p3

浮点型默认就是小数点后保留6位。再好好看看书。追问

这个默认的小数位数可以设置吗??

追答

System.out.println(String.format("%.1f", f)); // 1位
System.out.println(String.format("%.2f", f)); // 2位
System.out.println(String.format("%.10f", f)); // 10位

本回答被提问者和网友采纳

特定用例的 String.Format

【中文标题】特定用例的 String.Format【英文标题】:String.Format for a specific use case 【发布时间】:2013-07-15 00:52:29 【问题描述】:

我正在 .NET Framework 中寻找一个String.Format() 说明符来允许这样做:

-- 例如,对于介于 0 和 1 之间的值、前导数字(0 或 1)、小数分隔符和后面的三位数字。 0.995, 1.000, 0.015

-- 0 到 100 之间,小数点后两位:0.00, 5.46, 10.0

-- 介于 100 和 10000 之间,没有小数位:543、886、2576

基本上,我认为需要四个有效数字,只有当数字非常小时才会出现小数位。我的输出都没有负值。编辑:我需要避免使用科学记数法。

有没有格式说明符可以给我一些接近的东西?或者,或者,可以修改双精度字符串(如“43667.73625003946255”)来生成它的正则表达式?

【问题讨论】:

有点吹毛求疵,但只是为了确保:我们应该按照您的示例进行操作吗?四个有效数字将导致 0.9950 和 10.00 等。您的示例具有不同数量的有效数字。 需要单个格式字符串还是可以在自定义IFormatProvider 中实现它? 是的,通过我的例子。不同的范围需要不同的有效数字。如果可能的话,我希望它采用单个格式字符串; XAML 前端将使用它,我想在绑定语法中指定格式。如果绑定可以指定IFormatProvider,我会使用它! 我已经修改了问题以澄清范围。 【参考方案1】:

我认为您不会找到可以为您提供这些结果的单个格式字符串,但这里有一个应该可以工作的自定义 IFormatProvider

public class CustomFormatter : IFormatProvider, ICustomFormatter

    public string Format(string format, object arg, IFormatProvider formatProvider)
    
        if(IsNumber(arg))
        
            double number = Convert.ToDouble(arg);
            if(number < 1)
                return string.Format("0:0.000", arg);
            else if(number < 10)
                return string.Format("0:0.00", arg);
            return string.Format("0:0", arg);
        
        else return string.Format(format,arg);  // default formatting for other types
    

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

    public static bool IsNumber(object value)
    
        return value is sbyte
                || value is byte
                || value is short
                || value is ushort
                || value is int
                || value is uint
                || value is long
                || value is ulong
                || value is float
                || value is double
                || value is decimal;
    


void Main()

    foreach(object val in (new object[] 0, 0.05, 1, 1.0, 1.5, 9.9, 10, 10m,0XFF))
        Console.WriteLine(val + " : "+string.Format(new CustomFormatter(),"0",val));

输出:

0    : 0.000
0.05 : 0.050
1    : 1.00
1.0  : 1.00
1.5  : 1.50
9.9  : 9.90
10   : 10
10m  : 10
255  : 255

【讨论】:

【参考方案2】:

doubeValue.ToString("g3") 将为您提供 3 位有效数字的文本表示。

注意,如果小数点左边超过3位,它将使用科学计数法。

0.57464.ToString("g3") //---> 0.575
1234.ToString("g3") //---> 1.23e+03
13.ToString("g3") //---> 13
string.Format("0:g3", 999) //---> 999
string.Format("0:g3", 0.000324) //---> 0.000324

【讨论】:

我要避免使用科学记数法【参考方案3】:

我会实现一个简单的扩展方法:

public static class DoubleExtensions 
    public static string ToCustomString(this double value) 
        var absValue = Math.Abs(value);
        if (absValue < 1)
            return string.Format("0:N3", value);
        if (absValue < 100)
            return string.Format("0:N2", value);
        return string.Format("0:N0", value);
    

【讨论】:

以上是关于String.format 方法小数问题的主要内容,如果未能解决你的问题,请参考以下文章

java保留两位小数4种方法

String.format保留小数位数

学习java时在要求输出的数字带俩个小数点时,利用String.format时出现的问题

使用String.format的Java十进制格式?

String.format() 和 DecimalFormat 实际上没有格式化

string.Format字符串格式说明