我有以下代码:
import java.sql.*;
import java.math.*;
public class Testd1 {
public static void main(String[] args) {
System.out.println("Sum of the specific column!");
Connection con = null;
int m = 1;
double sum, sum1, sum2;
int e[];
e = new int[100];
int p;
int decimalPlaces = 5;
for (int i = 0; i < e.length; i++) {
e[i] = 0;
}
double b2, c2, d2, u2, v2;
int i, j, k, x, y;
double mat[][] = new double[10][10];
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/prathi", "root", "mysql");
try {
Statement st = con.createStatement();
ResultSet res = st.executeQuery(
"SELECT Service_ID,SUM(consumer_feedback) " +
"FROM consumer1 group by Service_ID");
while (res.next()) {
int data = res.getInt(1);
System.out.println(data);
System.out.println("\n\n");
int c1 = res.getInt(2);
e[m] = res.getInt(2);
if (e[m] < 0) {
e[m] = 0;
}
m++;
System.out.print(c1);
System.out.println("\t\t");
}
sum = e[1] + e[2] + e[3] + e[4] + e[5];
System.out.println("\n \n The sum is" + sum);
for (p = 21; p <= 25; p++) {
if (e[p] != 0) {
e[p] = e[p] / (int) sum;
//I have type casted sum to get output
}
BigDecimal bd1 = new BigDecimal(e[p]);
bd1 = bd1.setScale(decimalPlaces,
BigDecimal.ROUND_HALF_UP); // setScale is immutable
e[p] = bd1.intValue();
System.out.println("\n\n The normalized value is" + e[p]);
mat[4][p - 21] = e[p];
}
} catch (SQLException s) {
System.out.println("SQL statement is not executed!");
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
我有一个名为consumer1的表。在计算总和后,我得到的值如下
的MySQL&GT;通过Service_从consumer1组中选择Service_ID,sum(consumer_feedback) ID;
Service_ID sum(consumer_feedback) 31 17 32 0 33 60 34 38 35 | 38 在我的程序中,我正确地获得每个Service_ID的总和。但是,在规范化之后,即在我计算17/153 = 0.111时,我得到的归一化值是0.我希望在四舍五入后正确显示归一化值。我想输出如下
C:&gt; javac Testd1.java
C:&gt; java Testd1 具体栏目的总和! 31
17 32
0 33
60 34
38 35
38
总和为153.0
归一化值为0
归一化值为0
归一化值为0
归一化值为0
归一化值为0
但是,在规范化之后,我希望得到17/153 = 0.111。我得到的归一化值为0.我希望将这些值四舍五入。
答案 0 :(得分:1)
int e[];
...
e[p] = bd1.intValue();
e是一个整数数组。你怎么期望整数的值为0.111?
将e更改为某种可以包含小数部分的类型。
答案 1 :(得分:1)
其他一些评论:
我认为您要将以下内容设置为0
,因为您的e
数组似乎基于零。
int m = 1;
Java中的局部变量不会被初始化为任何默认值,因此在定义变量时初始化变量是个好习惯:
double sum = 0.0, sum1 = 0.0, sum2 = 0.0;
意识到您已经对e
数组的大小进行了硬编码,但您的查询可以返回更多行,并且您的程序会崩溃。
int e[] = new int[100];
以下代码:
e[p] = e[p] / (int) sum;
......不会做你想做的事。以下是您正在做的另一种观点:
int = int / (int) double;
您将结果存储在整数变量中,因此在您到达以下行之前,您已经丢失了结果的小数部分:
BigDecimal bd1 = new BigDecimal(e[p]);