Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置double的格式以省略不必要的";。0“;永远不要结束_Java_String Formatting - Fatal编程技术网

Java 设置double的格式以省略不必要的";。0“;永远不要结束

Java 设置double的格式以省略不必要的";。0“;永远不要结束,java,string-formatting,Java,String Formatting,我知道如何设置双精度的格式,以便只保留可用的小数位数(DP),最多保留一定数量的DP。此示例最多可保持4 DPs double d = 1.0; DecimalFormat df = new DecimalFormat("#.####"); System.out.print(df.format(d)); // returns "1" double d = 1.23; DecimalFormat df = new DecimalFormat("#.####

我知道如何设置双精度的格式,以便只保留可用的小数位数(DP),最多保留一定数量的DP。此示例最多可保持4 DPs

    double d = 1.0;
    DecimalFormat df = new DecimalFormat("#.####");
    System.out.print(df.format(d)); // returns "1"

    double d = 1.23;
    DecimalFormat df = new DecimalFormat("#.####");
    System.out.print(df.format(d)); // returns "1.23"

    double d = 1.2345678;
    DecimalFormat df = new DecimalFormat("#.####");
    System.out.print(df.format(d)); // returns "1.2346", rounding off: bad!

现在我希望整数,例如
1.0
返回
“1”
,而不返回不必要的
.0
,并且
#
格式字符确实提供了该功能。但我如何确保这个数字永远不会四舍五入呢?任何其他方式都有任何其他方式,除了一个任意长链的<编码>《代码>。。。《代码>>。。。。。《代码>。。。。。。。。。。。。。。35支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支###########“

或者我应该使用默认的double到string的转换,并截断
“.0”
,如果它出现在末尾:

    String s = "" + d;
    if(s.substring(s.length()-2).equals(".0")) {
        s=s.substring(0, s.length()-2);
    }
这两种方法似乎都非常笨拙

我使用以下方法

double d =
String s = (long) d == d ? "" + (long) d : "" + d; 
如果你需要双倍而不是双倍。(就我个人而言,如果可以的话,我会避免使用包装器)


可以使用Double.doubleToLongBits()并提取指数和尾数。从api文档:

位63(掩码0x80000000000000L选择的位) 表示浮点数的符号。位62-52(位 由掩码0x7ff0000000000000L)选择的表示 指数。位51-0(掩码选择的位 0x000FFFFFFFFFL)表示有效位(有时称为 浮点数的尾数)

指数可用于确定有效位数,但您必须始终在某个点进行四舍五入,因为某些二进制双精度值在十进制中是无止境的


对于二进制表示法,您可以简单地使用尾数并将小数点放在正确的位置(如有必要,用零填充)。

默认情况下,舍入模式为
DecimalFormat
。您可以使用
设置舍入模式()
方法根据需要设置不同的舍入格式

设置舍入模式的示例代码

double d = 1.2345678;
        DecimalFormat df = new DecimalFormat("#.####");
        df.setRoundingMode(RoundingMode.DOWN);
        System.out.print(df.format(d));//result 1.2345 because of rounding down

大多数非整数十进制值不能表示为二进制数,例如0.1。因此,它将近似为0.100000000000000000001或类似值。也许您应该考虑所示表示的误差有多大(或者在上一次计算中还剩下多少个有效数字)对不起,我没有回答关于整数的问题,但我会留下它,以防有人会使用;-)“我如何确保数字永远不会被舍入”@Jean-FrançoisCorbett:除非你使用二进制或任何2^n的基数系统(例如八进制或十六进制),否则你不能这样做当然,我知道浮点运算,但这不是问题的重点。如何确保数字的字符串表示形式不会四舍五入为
“”+d
?这个答案显式地舍入了它,这与我所问的正好相反。即使编译器可能会对它进行多次优化,我相信使用String.valueOf(x)而不是“+x@rurouni很多人会同意你的观点。然而,我更喜欢简单的代码,因为它读写速度更快,可以节省您的时间。如果性能有问题,我仍然不会在valueOf创建对象时使用它。@peter:“+d还会在内部调用String.valueOf()。它将被转换为“new StringBuilder().append(“”).append(String.valueOf(d)).toString()”的等价物,从而创建更多的对象。+1谢谢。我刚刚意识到我的意思是双重的而不是双重的。因此,我想我只需要做
(long)(double)d
,而不是只做
(long)d
(未编译)。@rurouni正如我在这里发现的那样,使用String.valueOf可以节省计算机约0.014微秒,但是使用
“+
可以节省更多的时间。
double d = 1.2345678;
        DecimalFormat df = new DecimalFormat("#.####");
        df.setRoundingMode(RoundingMode.DOWN);
        System.out.print(df.format(d));//result 1.2345 because of rounding down