java計(jì)算標(biāo)準(zhǔn)分

標(biāo)準(zhǔn)分計(jì)算兩種實(shí)現(xiàn)方式,計(jì)算公式見百度百科。
1 直接借助sql,寫一個(gè)方法

 /**
 * 計(jì)算生成標(biāo)準(zhǔn)分
 * @return
 */
public int doGenerateStandScore() {
    StringBuilder sql = new StringBuilder();
    sql.append("    SELECT                                                                                   ");
    sql.append("        avg(er.total_score) avgScore,                                                        ");
    sql.append("        STD(er.total_score) standardDeviation,                                               ");
    sql.append("        39/((max(total_score) - avg(er.total_score))/STD(er.total_score)-                    ");
    sql.append("        (50 - avg(er.total_score))/STD(er.total_score)) coefficient,                         ");
    sql.append("        60 - (50 - avg(er.total_score))/STD(er.total_score)*39/((max(total_score) -          ");
    sql.append("        avg(er.total_score))/STD(er.total_score) -                                           ");
    sql.append("        (50 - avg(er.total_score))/STD(er.total_score)) referPoints                          ");
    sql.append("    FROM                                                                                     ");
    sql.append("        exam_reserve er                                                                      ");
    sql.append("    INNER JOIN exam_batch bat ON bat.id = er.fk_exam_batch_id                                ");
    sql.append("    INNER JOIN enum_const active ON active.id = bat.flag_active                              ");
    sql.append("    WHERE                                                                                    ");
    sql.append("        active. CODE = '1'                                                                   ");
    sql.append("    AND er.total_score IS NOT NULL                                                           ");
        // 平均分,方差,擴(kuò)大系數(shù),基準(zhǔn)分
    Map<String, Object> resultMap =  myGeneralDao.getOneMapBySQL(sql.toString());
    if (MapUtils.isEmpty(resultMap)) {
        throw new ServiceException("沒有需要合成標(biāo)準(zhǔn)分的數(shù)據(jù)");
    }
    BigDecimal avgScore = new BigDecimal(String.valueOf(resultMap.get("avgScore")));
    BigDecimal standardDeviation = new BigDecimal(String.valueOf(resultMap.get("standardDeviation")));
    BigDecimal coefficient = new BigDecimal(String.valueOf(resultMap.get("coefficient")));
    BigDecimal referPoints = new BigDecimal(String.valueOf(resultMap.get("referPoints")));
    sql.delete(0, sql.length());
    sql.append("    UPDATE exam_reserve er                                                     ");
    sql.append("    INNER JOIN exam_batch bat ON bat.id = er.fk_exam_batch_id                  ");
    sql.append("    INNER JOIN enum_const active ON active.id = bat.flag_active                ");
    sql.append("    SET er.standard_score = round((er.total_score - ?)/? * ? + ?)              ");
    sql.append("    WHERE                                                                      ");
    sql.append("        active. CODE = '1'                                                     ");
    sql.append("    AND er.total_score IS NOT NULL                                             ");
    return myGeneralDao.executeBySQL(sql.toString(), avgScore, standardDeviation, coefficient, referPoints);
}

2 java代碼方式寫工具方法。

package plugins;

import com.ss.excel.db.DB;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;

/**
 * 計(jì)算標(biāo)準(zhǔn)分  (此處嚴(yán)格來講應(yīng)該將double改成BigDecimal類型)
 *
 * @author ss
 */
public class StandardScoreUtils {

    public static void main(String[] args) throws SQLException {
        List<Double> rawScores = DB.query(sql);// sql為查詢的結(jié)果集
        double avgScore = calculateScoreMean(rawScores);
        System.out.println("平均分----" + avgScore);

        double standardDeviation = calculateSTD(rawScores, avgScore);
        System.out.println("標(biāo)準(zhǔn)差----" + standardDeviation);

        System.out.println("****************************************************************************");
        for (Double rawScore : rawScores) {
            double standardScore = calculateStandardScore(rawScore, standardDeviation, avgScore);
            double result = new BigDecimal(standardScore).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            System.out.println("原始分:" + rawScore + "---- 標(biāo)準(zhǔn)分四舍五入:" + result + "----標(biāo)準(zhǔn)分:" + standardScore);
        }
    }

    /**
     * 計(jì)算平均分
     * @param rawScores
     * @return
     */
    public static double calculateScoreMean(List<Double> rawScores) {
        double scoreAll = 0.0;
        for (Double score : rawScores) {
            scoreAll += score;
        }
        return scoreAll/rawScores.size();
    }

    /**
     * 計(jì)算標(biāo)準(zhǔn)差
     * @param rawScores
     * @param avgScore
     * @return
     */
    public static double calculateSTD(List<Double> rawScores, double avgScore) {
        double allSquare = 0.0;
        for (Double rawScore : rawScores) {
            allSquare += (rawScore - avgScore) * (rawScore - avgScore);
        }
        return Math.sqrt(allSquare/rawScores.size());
    }

    /**
     * 計(jì)算標(biāo)準(zhǔn)分
     * @param score
     * @param standardDeviation
     * @param avgScore
     * @return
     */
    public static double calculateStandardScore(double score, double standardDeviation, double avgScore) {
        double standardScore = (score - avgScore)/standardDeviation;
        return standardScore;
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述及標(biāo)簽體系搭建 1 概述 隨著信息技術(shù)的迅速發(fā)展和信息內(nèi)容的日益增長(zhǎng),“信息過載”問題愈來愈嚴(yán)重,愈發(fā)帶來很大...
    JinkeyAI閱讀 23,322評(píng)論 10 241
  • 每天進(jìn)步一點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)~~從開始只能寫幾句話、模仿別人的觀點(diǎn),到現(xiàn)...
    一個(gè)帥氣的名字呀閱讀 19,329評(píng)論 4 31
  • 周末,很多很多的周末連在一起,你在筆耕不輟或是陪著家人盡享歡樂?也許吧在你的筆下或許有我,也許在你的故事...
    藍(lán)星_badf閱讀 239評(píng)論 0 1
  • 兩周前的周末,我照常在王者峽谷廝殺正酣。“大可,你媽咬警察被抓了!”胡愛一句話把我逗樂了。打開家族微信群才發(fā)現(xiàn)我...
    飛天德_bd82閱讀 324評(píng)論 0 0
  • 每一趟旅程都會(huì)有一個(gè)終點(diǎn)。而人能否在終點(diǎn)之前盡情欣賞沿途的風(fēng)景,取決于他趕往終點(diǎn)的心有多急切。 他開著窗舉著手機(jī)正...
    化濁閱讀 343評(píng)論 2 2

友情鏈接更多精彩內(nèi)容