Преглед на файлове

处理decimal.NewFromFloat 引起的Panic

xyxie преди 1 година
родител
ревизия
ded3d34624
променени са 4 файла, в които са добавени 29 реда и са изтрити 4 реда
  1. 5 0
      logic/profit_chart_info.go
  2. 6 1
      models/base_from_calculate.go
  3. 13 2
      models/base_predict_from_calculate.go
  4. 5 1
      models/predict_edb.go

+ 5 - 0
logic/profit_chart_info.go

@@ -520,6 +520,11 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			}
 			//yDataMap[n] = calVal
 			//xEdbInfoIdList = append(xEdbInfoIdList, n)
+			nanCheck := fmt.Sprintf("%0.f", calVal)
+			// 分母为0.0的报错
+			if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+				continue
+			}
 			calVal, _ = decimal.NewFromFloat(calVal).Round(4).Float64()
 			yDataMap[tmpN] = calVal
 			xEdbInfoIdList = append(xEdbInfoIdList, tmpN)

+ 6 - 1
models/base_from_calculate.go

@@ -463,13 +463,18 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
 		if calResult.IsNan() {
 			continue
 		}
+
 		calVal, err := calResult.Float64()
 		if err != nil {
 			err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
 			fmt.Println(err)
 			return err
 		}
-
+		nanCheck := fmt.Sprintf("%0.f", calVal)
+		// 分母为0.0的报错
+		if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+			continue
+		}
 		// 有计算出来值,那么就从待删除指标中移除
 		delete(removeDateMap, sk)
 		saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)

+ 13 - 2
models/base_predict_from_calculate.go

@@ -189,6 +189,13 @@ func AddPredictCalculateDataBak(edbInfoIdList []*EdbInfo, edbInfoId int, edbCode
 			//需要存入的数据
 			{
 				if latestDateStr == sk {
+					nanCheck := fmt.Sprintf("%0.f", calVal)
+					// 分母为0.0的报错
+					if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+						err = errors.New("计算失败 分母为0:Err: formulaStr:" + formulaFormStr)
+						fmt.Println(err)
+						return
+					}
 					latestValue, _ = decimal.NewFromFloat(calVal).Truncate(4).Float64() //保留4位小数
 				}
 				dataTime, _ := time.ParseInLocation(utils.FormatDate, sk, time.Local)
@@ -365,12 +372,16 @@ func refreshAllPredictCalculate(to orm.TxOrmer, edbInfoIdList []*EdbInfo, edbInf
 				fmt.Println(err)
 				return
 			}
-
+			nanCheck := fmt.Sprintf("%0.f", calVal)
+			// 分母为0.0的报错
+			if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+				removeDateList = append(removeDateList, sk)
+				continue
+			}
 			// 最近实际日期的实际数据
 			if latestDateStr == sk {
 				latestValue, _ = decimal.NewFromFloat(calVal).Truncate(4).Float64() //保留4位小数
 			}
-
 			saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
 			if existVal, ok := dataMap[sk]; !ok {
 				dataTime, _ := time.ParseInLocation(utils.FormatDate, sk, time.Local)

+ 5 - 1
models/predict_edb.go

@@ -144,7 +144,11 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (resultDataList []*E
 			//fmt.Println(err)
 			return
 		}
-
+		nanCheck := fmt.Sprintf("%0.f", calVal)
+		if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
+			removeDateList = append(removeDateList, sk)
+			continue
+		}
 		saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
 		existPredictEdbRuleData, ok := dataMap[sk]
 		if !ok {