搞清java中数据基本类型的转换
题目简介:给出年利率,贷款总额,年数,能够显示出月支付额,总共还款数;问题:注意月支额,总支额两行,不明白,为什么括号加的位置不同,月支额应该是小数点后一位,总支额小数点后两位。明明用的(int)型强制转换,求大神解答!!
package javajichu;基本数据类型 --------------------编程问答-------------------- 没看懂你的问题,你想表达什么?? --------------------编程问答-------------------- 月支额=(int)(月支额*100/100.0);
import javax.swing.JOptionPane;
import java.math.*;
public class Computeloan {
public static void main(String[] args) {
String input1=JOptionPane.showInputDialog("请输入年利率:如8.5");
double 年利率=Double.parseDouble(input1);
double 月利率=年利率/1200;
String input2=JOptionPane.showInputDialog("请输入贷款年数:");
double 年数=Double.parseDouble(input2);
String input3=JOptionPane.showInputDialog("请输入贷款总额:");
double 贷款总额=Double.parseDouble(input3);
double 月支额=贷款总额*月利率/(1-1/Math.pow((1+月利率),年数*12));//计算出月支额
double 总支额=月支额*12*年数;
月支额=(int)(月支额*100/100.0);
总支额=(int)(总支额*100)/100.0;
String output="总支额为:"+总支额+"\n月支额为:"+月支额;//string 定义字符串类型
JOptionPane.showMessageDialog(null, output);
}
}
总支额=(int)(总支额*100)/100.0;
这个是吧
第一个
等于把最后的结果(月支额*100/100.0)给转换成了int型。。
而第二个,
等于吧(总支额*100)这个转换成了int类型,然后除以100.0这个double类型。。。
所以,你明白了吧? --------------------编程问答-------------------- 楼上正解,强制类型转化最好把要转化的全部用括号括起来,这样优先级显得明确一些 --------------------编程问答-------------------- 其实我想说
你这样强制转换应该会编译错误 --------------------编程问答-------------------- 打错了?或者说书上印错了?请看源程序:
http://www.cse.ust.hk/~liao/comp201/slides/html/ComputeLoan.html
--------------------编程问答-------------------- 中文变量名总觉得怪怪的 --------------------编程问答-------------------- 百度ComputeLoan.java会搜到一大堆代码,另外《Java语言程序设计:基础篇(原书第8版)》中也有这个程序,和你提供的这个程序都有出入 所以...不必在为此纠结了 --------------------编程问答--------------------
import javax.swing.JOptionPane;
public class ComputeLoan {
/** Main method */
public static void main(String[] args) {
// Enter yearly interest rate
String annualInterestRateString = JOptionPane.showInputDialog(
"Enter yearly interest rate, for example 8.25:");
// Convert string to double
double annualInterestRate =
Double.parseDouble(annualInterestRateString);
// Obtain monthly interest rate
double monthlyInterestRate = annualInterestRate / 1200;
// Enter number of years
String numberOfYearsString = JOptionPane.showInputDialog(
"Enter number of years as an integer, \nfor example 5:");
// Convert string to int
int numberOfYears = Integer.parseInt(numberOfYearsString);
// Enter loan amount
String loanString = JOptionPane.showInputDialog(
"Enter loan amount, for example 120000.95:");
// Convert string to double
double loanAmount = Double.parseDouble(loanString);
// Calculate payment
double monthlyPayment = loanAmount * monthlyInterestRate / (1
- 1 / Math.pow(1 + monthlyInterestRate, numberOfYears * 12));
double totalPayment = monthlyPayment * numberOfYears * 12;
// Format to keep two digits after the decimal point
monthlyPayment = (int)(monthlyPayment * 100) / 100.0;
totalPayment = (int)(totalPayment * 100) / 100.0;
// Display results
String output = "The monthly payment is " + monthlyPayment +
"\nThe total payment is " + totalPayment;
JOptionPane.showMessageDialog(null, output);
}
是的 double转int 应该会丢失精度的!很奇怪咋编译通过了 --------------------编程问答--------------------
不过一般在处理这些问题的时候,最好先要搞清楚自己想要处理的一些细节。这样的话可以快速的解决这种问题。 --------------------编程问答-------------------- --------------------编程问答--------------------
既然月支付已经强制转换为int型,为什么输出时,小数点后还有一位?(就是这一点不清楚……) --------------------编程问答--------------------
额额,这个就是看这本书时自己敲的代码,想不通明明已经(int)强制转换过了,为什么输出时小数点后还有一位(书上源代码:
monthlyPayment=(int)(monthlyPayment*100)/100.0;
totalPayment=(int)(totalPayment*100)/100/0;
)
我自己将括号稍微改动了下…… --------------------编程问答--------------------
大哥,英语学的不好啊…… --------------------编程问答--------------------
好吧,我想多了 = = --------------------编程问答--------------------
月支额=(int)(月支额*100/100.0);
总支额=(int)(总支额*100)/100.0;
这个是吧
第一个
等于把最后的结果(月支额*100/100.0)给转换成了int型。。
而第二个,
等于吧(总支额*100)这个转换成了int类型,然后除以100.0这个double类型。。。
所以,你明白了吧?
既然月支付已经强制转换为int型,为什么输出时,小数点后还有一位?(就是这一点不清楚……)
你说一个int型的数,除以一个double型的,返回的结果应该是什么形式的呢?
月支额=(int)(月支额*100/100.0);
总支额=(int)(总支额*100)/100.0;
这个是吧
第一个
等于把最后的结果(月支额*100/100.0)给转换成了int型。。
而第二个,
等于吧(总支额*100)这个转换成了int类型,然后除以100.0这个double类型。。。
所以,你明白了吧?
既然月支付已经强制转换为int型,为什么输出时,小数点后还有一位?(就是这一点不清楚……)
那是因为你定义的时候,
定义 月支付 为double型的,
所以即使你强转为了int型,
由于你定义的为double型,所以最后也会转化为double型。
你可以输出一下
mouth=(int)(100.0*100/99.5);
(100.0*100/99.5);应该返回的是一个100.5....
但是最后输出mouth的你会发现只输出了一个100,所以证明确实被int转型过的。
--------------------编程问答--------------------
中文变量名总觉得怪怪的
大哥,英语学的不好啊……
一开始a,b,c
后面慢慢就可以英文单词了。。
补充:Java , Java SE