当前位置:编程学习 > JAVA >>

搞清java中数据基本类型的转换

题目简介:给出年利率,贷款总额,年数,能够显示出月支付额,总共还款数;
问题:注意月支额,总支额两行,不明白,为什么括号加的位置不同,月支额应该是小数点后一位,总支额小数点后两位。明明用的(int)型强制转换,求大神解答!!

package javajichu;

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);
                            总支额=(int)(总支额*100)/100.0;
这个是吧

第一个
等于把最后的结果(月支额*100/100.0)给转换成了int型。。

而第二个,
等于吧(总支额*100)这个转换成了int类型,然后除以100.0这个double类型。。。

所以,你明白了吧? --------------------编程问答-------------------- 楼上正解,强制类型转化最好把要转化的全部用括号括起来,这样优先级显得明确一些 --------------------编程问答-------------------- 其实我想说  
你这样强制转换应该会编译错误 --------------------编程问答-------------------- 打错了?或者说书上印错了?请看源程序:

http://www.cse.ust.hk/~liao/comp201/slides/html/ComputeLoan.html


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);

  }
--------------------编程问答-------------------- 中文变量名总觉得怪怪的 --------------------编程问答-------------------- 百度ComputeLoan.java会搜到一大堆代码,另外《Java语言程序设计:基础篇(原书第8版)》中也有这个程序,和你提供的这个程序都有出入 所以...不必在为此纠结了 --------------------编程问答--------------------
引用 4 楼 only_qin_wo 的回复:
其实我想说  
你这样强制转换应该会编译错误

是的  double转int  应该会丢失精度的!很奇怪咋编译通过了 --------------------编程问答--------------------
引用 3 楼 solomon5926 的回复:
楼上正解,强制类型转化最好把要转化的全部用括号括起来,这样优先级显得明确一些


不过一般在处理这些问题的时候,最好先要搞清楚自己想要处理的一些细节。这样的话可以快速的解决这种问题。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 2 楼 AA5279AA 的回复:
月支额=(int)(月支额*100/100.0);
                            总支额=(int)(总支额*100)/100.0;
这个是吧

第一个
等于把最后的结果(月支额*100/100.0)给转换成了int型。。

而第二个,
等于吧(总支额*100)这个转换成了int类型,然后除以100.0这个double类型。。。

所以,你明白了吧?

既然月支付已经强制转换为int型,为什么输出时,小数点后还有一位?(就是这一点不清楚……) --------------------编程问答--------------------
引用 7 楼 cocoa_cactus 的回复:
百度ComputeLoan.java会搜到一大堆代码,另外《Java语言程序设计:基础篇(原书第8版)》中也有这个程序,和你提供的这个程序都有出入 所以...不必在为此纠结了

额额,这个就是看这本书时自己敲的代码,想不通明明已经(int)强制转换过了,为什么输出时小数点后还有一位(书上源代码:
monthlyPayment=(int)(monthlyPayment*100)/100.0;
totalPayment=(int)(totalPayment*100)/100/0;

我自己将括号稍微改动了下…… --------------------编程问答--------------------
引用 6 楼 soyestrellafortuna 的回复:
中文变量名总觉得怪怪的

大哥,英语学的不好啊…… --------------------编程问答--------------------
引用 12 楼 ZHENGEGE86 的回复:
Quote: 引用 7 楼 cocoa_cactus 的回复:

百度ComputeLoan.java会搜到一大堆代码,另外《Java语言程序设计:基础篇(原书第8版)》中也有这个程序,和你提供的这个程序都有出入 所以...不必在为此纠结了

额额,这个就是看这本书时自己敲的代码,想不通明明已经(int)强制转换过了,为什么输出时小数点后还有一位(书上源代码:
monthlyPayment=(int)(monthlyPayment*100)/100.0;
totalPayment=(int)(totalPayment*100)/100/0;

我自己将括号稍微改动了下……

好吧,我想多了 = = --------------------编程问答--------------------
引用 11 楼 ZHENGEGE86 的回复:
Quote: 引用 2 楼 AA5279AA 的回复:

月支额=(int)(月支额*100/100.0);
                            总支额=(int)(总支额*100)/100.0;
这个是吧

第一个
等于把最后的结果(月支额*100/100.0)给转换成了int型。。

而第二个,
等于吧(总支额*100)这个转换成了int类型,然后除以100.0这个double类型。。。

所以,你明白了吧?

既然月支付已经强制转换为int型,为什么输出时,小数点后还有一位?(就是这一点不清楚……)


你说一个int型的数,除以一个double型的,返回的结果应该是什么形式的呢?


引用 11 楼 ZHENGEGE86 的回复:
Quote: 引用 2 楼 AA5279AA 的回复:

月支额=(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转型过的。
--------------------编程问答--------------------
引用 13 楼 ZHENGEGE86 的回复:
Quote: 引用 6 楼 soyestrellafortuna 的回复:

中文变量名总觉得怪怪的

大哥,英语学的不好啊……

一开始a,b,c
后面慢慢就可以英文单词了。。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,