精华内容
下载资源
问答
  • 也就是两个decimal类型的值相除的结果为null。 解决方法: 自定义一个求两个decimal类型数值相除的函数: //自定义函数 spark.udf.register("chufa", (num1: java.math.BigDecimal ,num2: java.math.BigDecimal...

    源表pdwqy_qxzh_piu字段类型:
    在这里插入图片描述
    如代码所示,在计算过程时,RFHL计算结果总是为null。
    代码:

    //读取数据
    val data: DataFrame = spark.read.format("jdbc")
          .option("url", "jdbc:mysql://21.76.120.XX:3306/us_app")
          .option("dbtable", "pdwqy_qxzh_piu")
          .option("user", "root")
          .option("password", "XXX")
          .load()
    data.createTempView("PIU_Table")
    
    val resultData = spark.sql(
          """
            |SELECT
            |               T1.TG_ID,
            |               date(T1.DATA_DATE) DATA_DATE,
            |               T1.I1,
            |               T1.I2,
            |               T1.I3,
            |               ROUND(AVG(T2.FZL), 4) PJFZL,
            |               ROUND(MAX(T2.FZL), 4) ZDFZL,
            |               ROUND(MIN(T2.FZL), 4) ZXFZL,
            |               case when MAX(T2.FZL) != 0 then round((AVG(T2.FZL)/MAX(T2.FZL))*100,4) else 0 end RFHL
            |          FROM PIU_Table T1 JOIN PIU_Table T2
            |         ON T1.TG_ID = T2.TG_ID
            |           and date(t1.data_date) = date(T2.data_date)
            |                  where t1.SJD='96'
            |         GROUP BY T1.I1,
            |                  T1.I2,
            |                  T1.I3,
            |                  T1.TG_ID,
            |                  date(T1.DATA_DATE)
          """.stripMargin)
    
    //打印字段类型
    resultData.printSchema()
    
    //将数据保存到表
    ConnOracleUtile.writeData(resultData,"pdwqy_qxzh_sbyxsj_copy")
    

    通过打印字段类型字段类型,得知数据类型AVG(T2.FZL)和MAX(T2.FZL)均为decimal:
    在这里插入图片描述
    而计算完的结果,RFHL为null。也就是两个decimal类型的值相除的结果为null。
    在这里插入图片描述
    解决方法:
    自定义一个求两个decimal类型数值相除的函数:

    //自定义函数
    spark.udf.register("chufa", (num1: java.math.BigDecimal ,num2: java.math.BigDecimal) => {
          (num1.toString.toDouble/num2.toString.toDouble)
     })
    
    val resultData = spark.sql(
          """
            |SELECT
            |               T1.TG_ID,
            |               yearMonthDay(T1.DATA_DATE) DATA_DATE,
            |               T1.I1,
            |               T1.I2,
            |               T1.I3,
            |               ROUND(AVG(T2.FZL), 4) PJFZL,
            |               ROUND(MAX(T2.FZL), 4) ZDFZL,
            |               ROUND(MIN(T2.FZL), 4) ZXFZL,
            |               case when MAX(T2.FZL) != 0 then round(chufa(AVG(T2.FZL),MAX(T2.FZL))*100,4) else 0 end RFHL
            |          FROM PIU_Table T1 JOIN PIU_Table T2
            |         ON T1.TG_ID = T2.TG_ID
            |           and yearMonthDay(t1.data_date) = yearMonthDay(T2.data_date)
            |                  where t1.SJD='96'
            |         GROUP BY T1.I1,
            |                  T1.I2,
            |                  T1.I3,
            |                  T1.TG_ID,
            |                  yearMonthDay(T1.DATA_DATE)
          """.stripMargin)
    resultData.printSchema()
    
    //将数据保存到表
    ConnOracleUtile.writeData(resultData,"pdwqy_qxzh_sbyxsj_copy")
    

    这时目标表中RFHL字段就有了数据:
    在这里插入图片描述
    原因探究:

    参考此文章https://issues.apache.org/jira/browse/SPARK-22036?jql=project%20%3D%20SPARK%20AND%20text%20~%20"BigDecimal"中对于SPARK-22036bug的描述:BigDecimal multiplication sometimes returns null

    spark确实存在此版本bug,两个BigDecimal类型的数相乘,有时会返回null。
    但是关于两个BigDecimal类型的数相除是否也存在这样的问题,本人暂时还没有找到相关的说明。
    那可不可以这样猜想,a/b也可以看做是a*(1/b)呢,仅作为一种猜想吧。
    在这里插入图片描述

    展开全文
  • https://leetcode.com/problems/fraction-to-recurring-decimal/参考 http://yucoding.blogspot.hk/2015/03/leetcode-question-fraction-to-recurring.html 的计算方法。思路见codeclass Solution: # @return a ...

    https://leetcode.com/problems/fraction-to-recurring-decimal/

    参考
    http://yucoding.blogspot.hk/2015/03/leetcode-question-fraction-to-recurring.html
    的计算方法。思路见code

    class Solution:
        # @return a string
        def fractionToDecimal(self, numerator, denominator):
            if numerator * denominator < 0:
                pos = False
            else:
                pos = True
            numerator = abs(numerator)
            denominator = abs(denominator)
    
            maxlen=1000#最多求到小数点后1000位
            mod = []#reminder的集合
            if numerator == 0 or denominator == 0:
                return "0"
            res = []#quotient的集合,也是结果的集合
            l = -1
            while len(mod) < maxlen:#一直除到小数位数超过给定的maxlen
                res.append(numerator/denominator)
                m = numerator % denominator
                if m == 0:
                    break
                if m in mod:
                    l = mod.index(m)#如果reminder在以前出现过,那么后面的结果就是在这个reminder对应的index开始不断的重复。重复res[l::]的结果,所以对这一部分加上括号就可以了
                    break
                else:
                    mod.append(m)
                    numerator = m * 10
    
            if len(res) == 1:#可以被整除,e.g. 6/3 = 2
                s = str(res[0])
            else:#结果是小数
                s = str(res[0]) + "."
                if l == -1:#结果是不循环小数
                    s = s + "".join([str(n) for n in res[1::]] )
                else:#结果是循环小数
                    s = s+ "".join([str(n) for n in res[1:l+1]]) + "(" + "".join([str(n) for n in res[l+1::]]) + ")"
            if pos:
                return s
            else:
                return "-"+s

    自己重写code

    class Solution(object):
        def fractionToDecimal(self, numerator, denominator):
            """
            :type numerator: int
            :type denominator: int
            :rtype: str
            """
            sign = 1
            if numerator * denominator < 0:
                sign = -1
            numerator, denominator = abs(numerator), abs(denominator)
            if numerator == 0 or denominator == 0: return '0'#这个注意加上
    
            if numerator % denominator == 0 : return  str(sign *numerator/denominator)
    
    
            res = []
            mod = []
    
            res_index = -1
            while len(mod) < 1000:
    
                res1 = numerator / denominator
                mod1 = numerator % denominator
    
                if mod1 == 0:
                    res.append(str(res1))#这个要记得加上, 或者直接在计算res1的时候就res.append
                    break
                elif mod1 in mod:
                    res_index = mod.index(mod1)
                    res.append(str(res1))#这个要记得加上, 或者直接在计算res1的时候就res.append
                    break
    
                res.append(str(res1))
                mod.append(mod1)
                numerator = mod1 * 10
    
            if res_index == -1:
                if sign == -1:
                    return '-' + str(res[0]) + '.' +''.join(res[1:])
                return str(res[0]) + '.' +''.join(res[1:])
            else:
                if sign == -1:
                    return '-' + str(res[0]) + '.' + ''.join(res[1:res_index + 1]) + '(' + ''.join(res[res_index + 1:]) + ')'
                return str(res[0]) + '.' + ''.join(res[1:res_index + 1]) + '(' + ''.join(res[res_index + 1:]) + ')'
    
    展开全文
  • SQL相除

    2012-07-25 16:46:32
    select [PI],Model,Line as '产线', sum(Pass) as '好机数',sum(Fail) as '坏机数', sum(Pass+Fail) as '合计...ltrim(cast(convert(float,sum(Fail))/sum(Pass+Fail)*100 as decimal(18,2)))+'%' as '坏机率' from [Me
    select [PI],Model,Line as '产线',  sum(Pass) as '好机数',sum(Fail) as '坏机数',   sum(Pass+Fail) as '合计', 
    
    ltrim(cast(convert(float,sum(Fail))/sum(Pass+Fail)*100 as decimal(18,2)))+'%' as '坏机率'    from [MesCount] 
    
    
    
    where [WorkDate]>'2012-7-21'
    
    
    
    GROUP BY [PI],Model,Line  ,WorkTime
    
    


    分子总是带有小数点,否则结果总是为0%

    如:

    select convert(float,10)/20--------0.5
    select 10/20--------------------------0

    展开全文
  • BigDecimal相除异常

    2019-09-27 03:44:10
    1 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result 解决: 不能整除产生的异常,解决方式是设置精度,实例如下 .divide(xxxx...

    使用两个BigDecimal类型的数字做除法运算时,出现了一个如下的异常信息:

    1 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

    解决:

    不能整除产生的异常,解决方式是设置精度,实例如下

    .divide(xxxxx,2,BigDecimal.ROUND_HALF_UP);

     

    转载于:https://www.cnblogs.com/davidwang456/p/7016439.html

    展开全文
  • 今天用BigDecimal类型的数据相除,其中param1和param1为BigDecimal类型, BigDecimal AA = (param1).divide(param2); 报错如下: java.lang.ArithmeticException: Non-terminating decimal expansion; no exact ...
  • SQL中的相除

    千次阅读 2011-03-06 23:16:00
    --SQL中的相除 SELECT CASE WHEN ISNULL(A+B,0)<>0 THEN  LTRIM(CONVERT(DEC(18,2),A*100.0/(A+B)))+'%' ELSE '' END AS '百分数'  FROM TB   --百分比的不同格式 ...
  • 难点:如何识别循环体?解决方法:用一个HashMap记录每一个余数,当出现重复的余数时,那么将会进入循环,两个重复余数...涉及技巧:1)在不断相除的过程中,把余数乘以10再进行下一次相除,保证一直是整数相除;...
  • BigDecimal b1 = new BigDecimal(assetRecDep.getPrice());...//相除divide double v = b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue(); assetRecDep.setDiscount(String.valueOf(v)); **b
  • select cast((cast(4000 as decimal(10,2))*6/5000) as decimal(10,2))*100 里面的一层cast是用来保证数据相除之后保留小数的部分,外面的一层cast是保证最后结果是两位小数
  • 两个数相除计算百分比

    千次阅读 2011-05-19 10:52:00
    string signal = "5"; ... decimal value = Convert.ToDecimal(signal) / 31; //小数据取两位 int result = (int)(Math.Round(value, 2) * 100); this.lbSingle.Text = result + "%";
  • 两个数相除,结果分为符号部分、整数部分、小数部分; 先求整数部分与符号位,然后取绝对值,例如(int)a/b 是整数部分, a%b 是剩余部分,来转化为小数部分。 如果两个数相除后的结果为无限循环小数,则分子部分的...
  • SELECT CONVERT(real,1)/6 SELECT CAST(CONVERT(real,1)/6 as decimal(10,2))
  • mysql 数据相除并保留2为小数点

    千次阅读 2011-05-27 17:20:34
    [code="sql"] SELECT CAST(CAST(112500 AS DECIMAL(18,2)) / CAST(46408 AS DECIMAL(18,2)) AS DECIMAL(18,2)) [/code]
  • 两个整型相除无法得到小数,例如: decimal len = 215651 / 645232; 需要改成如下: decimal len = (double)215651 / 645232; 只需要将任意一个数显示转换为高精度(double、float、decimal)...
  • 考虑到正负数相除的问题。如果分子分母一正一负,利用异或运算符判断,如果异或结果是true,则对分子分母取绝对值。 如果异或结果是false,则无需作处理。 另外,如果,分子特别大,而分母特别小,这样结果...
  • SQL 两数相除 保留两位小数

    万次阅读 2017-10-09 10:06:46
    CAST(xxx AS 类型), CONVERT(xxx,类型),整数:SIGNED,无符号整数:UNSIGNED ,浮点数:DECIMAL, ROUND()函数:SELECT ROUND(column_name,decimals) FROM table_name 这两个参数都是必须的, column_name:
  • private double deciMal(int top, int below) { double result = new BigDecimal((float)top / below).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); return result; }
  • select case when A=0 then '0.00%' else convert(varchar,CONVERT(decimal(18, 2),100*(isnull(B),0)) * 1.0 / A))+'%' end aaa
  • sql俩字段相除为什么结果是0

    千次阅读 2013-11-12 14:34:00
    恩,那应该在sum(out)这里就转换,转换一个就行了 convert(decimal(10,2),sum(out))
  • java两个int相除,返回保留两位小数

    万次阅读 2017-06-22 15:41:32
    private double deciMal(int top, int below) { double result = new BigDecimal((float)top / below).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); Log.e("返回的两位数",result+"'");
  • public static double deciMal(int top, int below) { double result = new BigDecimal((float)top / below).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); return result; }
  • string signal = "5";  decimal value = Convert.ToDecimal(signal) / 31;  //小数据取两位  int result = (int)(Math.Round(value, 2) * 100);  this.lbSingle.Text = r
  • declare @a decimal(18,4) set @a=6/7 print @a 为什么得到的结果为:0.0000 如果我想得到0.8571应该怎么写
  • Format format=new DecimalFormat("0.000");  System.out.println("format==="+format.format((double)34/54));    //保留两位小数并四舍五入  double d0 = 114.145123;... Decimal...
  • //将字符串根据/截取并转化为decimal进行相除 CONVERT (decimal(18,2),substring(b.OneToAny,1,charindex('/',b.OneToAny)-1))/CONVERT(decimal(18,2),substring(b.OneToAny,charindex('/',b.OneTo...
  • 分子或分母转为double或decimal 分子或分母转为double或decimal 分子或分母转为double或decimal 两个value相除,至少有一个为浮点数返回结果才正确 两个value相除,至少有一个为浮点数返回结果才正确 两个value相除...
  • 数字相除,注意10.00/100 10/100.00 小数点必写select cast(10.00/100 as decimal(18,2))select cast(10/100.00 as decimal(18,2)) 转载于:https://www.cnblogs.com/liyunchuan/p/11063968.html...
  • //随手打出来两个数字相除 new BigDecimal("3213").divide(new BigDecimal("847")) //报错信息是Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact ...
  • 之前已经分享了一部分内容 接上一章我们继续分享一些简单并且比较实用的SQL脚本 10、SQL中的相除 ...ELSE CAST(CONVERT(DECIMAL(18,2),A*100.0/(A-B)) AS VARCHAR(10))+'%' END AS '百分数' ...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

decimal相除