我想在Java中打印一个没有指数形式的双值。
double dexp = 12345678;
System.out.println("dexp: "+dexp);
它显示了这个E符号:1.2345678E7。
我希望它像这样打印:12345678
预防这种情况的最好方法是什么?
我想在Java中打印一个没有指数形式的双值。
double dexp = 12345678;
System.out.println("dexp: "+dexp);
它显示了这个E符号:1.2345678E7。
我希望它像这样打印:12345678
预防这种情况的最好方法是什么?
当前回答
Java防止E表示法出现双元:
五种将双精度数转换为正数的方法:
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class Runner {
public static void main(String[] args) {
double myvalue = 0.00000021d;
//Option 1 Print bare double.
System.out.println(myvalue);
//Option2, use decimalFormat.
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(8);
System.out.println(df.format(myvalue));
//Option 3, use printf.
System.out.printf("%.9f", myvalue);
System.out.println();
//Option 4, convert toBigDecimal and ask for toPlainString().
System.out.print(new BigDecimal(myvalue).toPlainString());
System.out.println();
//Option 5, String.format
System.out.println(String.format("%.12f", myvalue));
}
}
这个程序输出:
2.1E-7
.00000021
0.000000210
0.000000210000000000000001085015324114868562332958390470594167709350585
0.000000210000
都是相同的值。
Protip:如果你对为什么这些随机数字出现在double值的某个阈值之外感到困惑,这个视频解释了:为什么0.1+0.2等于0.30000000000001?
http://youtube.com/watch?v=PZRI1IfStY0
其他回答
我的解决方案: 字符串str =字符串。格式(“%。0 f”,yourDouble);
我得到了另一个涉及BigDecimal的toPlainString()的解决方案,但这次使用了string构造函数,这在javadoc中是推荐的:
此构造函数与Float返回的值兼容。toString和Double.toString。这通常是将浮点数或双精度浮点数转换为BigDecimal的首选方法,因为它不会受到BigDecimal(double)构造函数的不可预测性的影响。
它的最短形式是这样的:
return new BigDecimal(myDouble.toString()).stripTrailingZeros().toPlainString();
NaN和无限值必须额外检查,所以它的完整形式如下:
public static String doubleToString(Double d) {
if (d == null)
return null;
if (d.isNaN() || d.isInfinite())
return d.toString();
return new BigDecimal(d.toString()).stripTrailingZeros().toPlainString();
}
这也可以复制/粘贴,以很好地与Float一起工作。
对于Java 7及以下版本,对于任何零值double,这将导致“0.0”,因此您需要添加:
if (d.doubleValue() == 0)
return "0";
Java/Kotlin编译器将任何大于9999999(大于或等于1000万)的值转换为科学计数法。Epsilion符号。
示例:12345678被转换为1.2345678E7
使用此代码避免自动转换为科学计数法:
fun setTotalSalesValue(String total) {
var valueWithoutEpsilon = total.toBigDecimal()
/* Set the converted value to your android text view using setText() function */
salesTextView.setText( valueWithoutEpsilon.toPlainString() )
}
只要你的号码是整数,这个方法就有效:
double dnexp = 12345678;
System.out.println("dexp: " + (long)dexp);
如果双精度变量在小数点后有精度,它将截断它。
我认为每个人的想法都是正确的,但并非所有的答案都是直截了当的。 我认为这是一段非常有用的代码。下面是一些可行的方法:
System.out.println(String.format("%.8f", EnterYourDoubleVariableHere));
”。“8”是您设置要显示的小数点后数位的位置。
我正在使用Eclipse,它工作没有问题。
希望这对你有帮助。我将感激任何反馈!