程序显示带小数和“E”字符的结果。 示例:n = 35,然后当我按下计算按钮时,它会显示带小数的结果:922746.0000001我不想要任何小数我只想要主号码(922746)我该如何解决?
还有其他一些例子:当我把n = 36时它显示我错了(它显示我1.4930352000000019E7)如何删除E字符(我想显示完整结果)并设法获得正确的结果?
感谢您的帮助。
这是我的Java代码;
package com.example.fibonaccicalculator;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
Button btn1;
TextView tv1;
EditText edt1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
btn1 = (Button) findViewById(R.id.btn1);
tv1 = (TextView) findViewById(R.id.tv1);
edt1 = (EditText) findViewById(R.id.edt1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
double n = Double . valueOf(edt1.getText().toString());
double a = (1 / (Math.sqrt(5)));
double b = ((1+(Math.sqrt(5)))/2);
double c = ((1-(Math.sqrt(5)))/2);
double i = a * ((Math.pow(b,n)) - (Math.pow(c,n)));
String k = String.valueOf(i);
tv1.setText( k );
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
答案 0 :(得分:1)
获得这些结果的原因是因为您使用的是String.valueOf()
。
试试这个:
String k = String.format("%d",(int) i);
或者这个:
int i = (int) f;
String k = Integer.toString(i);
这样你就会得到一个转换后的字符串,其中包含没有任何小数的double值。
String.valueOf正在使用格式化程序(检查Double.toString()的Javadoc描述以获取有关其工作原理的详细信息)。
https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#toString%28double%29
如果您需要特定的表示而不是查看此课程:
https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html
另请参阅此valueOf() Method教程,了解String.valueOf()
的工作原理。
答案 1 :(得分:0)
如果您要删除所有尾随小数值,您只需typecast double
到int
:
double val = 922746.0000001;
int noDecimals = (int) val; // this gives 922746
如果您想要更灵活地使用舍入值,可以使用BigDecimal
类和RoundingMode
:
double round(double number, int decimalPlaces) {
if(decimalPlaces == 0) { // to remove all values after the dot
return (int) number;
}
BigDecimal bd = new BigDecimal(number).setScale(decimalPlaces, RoundingMode.HALF_EVEN);
return bd.doubleValue();
}
或者你可以使用Math.round()
方法并制作一个小辅助函数,如:
double round(double number, int decimalPlaces) {
if(decimalPlaces == 0) { // to remove all values after the dot
return (int) number;
}
int format = (int) Math.pow(10.0, decimalPlaces);
return (double) Math.round(format * number) / format;
}
上述方法的示例程序:
public static void main(String[] args) {
double val1 = 922746.0000001;
double val2 = 1.4930352000000019E7;
int decimalPlaces = 0;
System.out.println((int)round1(val1, decimalPlaces));
System.out.println((int)round2(val1, decimalPlaces));
System.out.println((int)round1(val2, decimalPlaces));
System.out.println((int)round2(val2, decimalPlaces));
}
输出:
922746
922746
14930352
14930352