有小数为的number类型的乘法是怎么实现的呢?
遇到一个奇怪的问题
比如说:
1 * 1.1 结果是1.10
1 * 1.12结果是1.12
1 * 1.123结果是 1.1230 
1 * 1.1234结果是 1.1234
上述结果是在游标中取得 直接返回给 vb.net vb转化为 decmial 在转化为字符串得到上述结果.
百思不得其解请高手指点.

解决方案 »

  1.   

    看你定义字段的时候怎么定义的
    SQL> create table test(id number);Table createdSQL> insert into test(id) values(1.1);1 row insertedSQL> commit;Commit completeSQL> select * from test;        ID
    ----------
           1.1SQL> drop table test;Table droppedSQL> create table test(id number(10,2));Table createdSQL> insert into test(id) values(1.1);1 row insertedSQL> select * from test;          ID
    ------------
            1.10SQL> 
      

  2.   

    带小数的这个 字段定义是:number(9,5)
    1 * 1.1 结果是1.10 
    1 * 1.12结果是1.12 
    1 * 1.123结果是 1.1230 
    1 * 1.1234结果是 1.1234 
    更崩溃的是
    1*1.12345 的结果是 1.123450
    如果是 补齐五个零 还说的过去,但是这个晕了就!
      

  3.   

    游标里是怎么计算的? 能否把计算的语句贴出来?1 * 1.1 结果是1.10 
    1 * 1.12结果是1.12 
    1 * 1.123结果是 1.1230 
    1 * 1.1234结果是 1.1234 
    1*1.12345 的结果是 1.123450 这个和number(9,5)没有多少关系, 你插入的是number 类型字段的值是 1.10 ,显示的当然是这个值了..
    如果超出长度的话就四舍五入的自动截取了
      

  4.   


    你这个要看一下是不是 vb.net 那边转换了,在 oracle 数据库里,你定义 number(9.5)
    你 1.123450 只会显示 1.12345, 1.123456 会显示成 1.12346
      

  5.   

    VB.NET那边做过测试:
    如果两个值都是 decmial 类型的 一个值是 1.123 另一个是1.1230 虽然表面去看都是 1.123D但是如果将其转化为字符串一个是"1.123"另一个是"1.1230"
    所以可能是从Oracle取得值得时候 这两个值就已经不相同了.
      

  6.   

    索性楼主贴出VB.NET代码给大伙瞧瞧吧,呵呵
      

  7.   

    源代码太漫长了 这是我的测试代码及结果:
          Dim   x   As   String   =   "123456789.1250 " 
                    Dim   x2   As   String   =   "123456789.125 " 
                    Dim   x3   As   String   =   "123456789.12500 " 
                    Dim   y1   As   String   =   "1.5 " 
                    Dim   y2   As   String   =   "1.6 "                 Dim   y3   As   String   =   "1 " 
                    Dim   y4   As   String   =   "1.6 "                 Dim   y5   As   String   =   "1.000 " 
                    Dim   y6   As   String   =   "1.6 "                 Dim   y7   As   String   =   "1.00 " 
                    Dim   y8   As   String   =   "1.6 "                 k   =   123456789.1256D 
                    Console.WriteLine(k.ToString) 
                    Console.WriteLine(Convert.ToDecimal(x).ToString()) 
                    Console.WriteLine(Convert.ToDecimal(x2).ToString()) 
                    Console.WriteLine(Convert.ToDecimal(x3).ToString())                 Console.WriteLine((Convert.ToDecimal(y1)   *   Convert.ToDecimal(y2)).ToString())                 Console.WriteLine((Convert.ToDecimal(y3)   *   Convert.ToDecimal(y4)).ToString()) 
                    Console.WriteLine((Convert.ToDecimal(y5)   *   Convert.ToDecimal(y6)).ToString()) 
                    Console.WriteLine((Convert.ToDecimal(y7)   *   Convert.ToDecimal(y8)).ToString()) 
    结果: 123456789.1256 
    123456789.1250 
    123456789.125 
    123456789.12500 
    2.40 
    1.6 
    1.6000 
    1.600 
      

  8.   

    ....
    很明显,你这个是 VB 的问题,和数据没有关系呀
    这个是 VB 字符串与数值之间的转换了而且非常规律呀,结果的小数位数等于两个乘数的小数位数之和
      

  9.   


    不是的,ORACLE 返回来的已经是一个确定值了,vb.net只是将其进行了 object.tostring() 跟踪时发现这个object 的类型在vb.net中是 Decimal 类型.
    然后上述代码我主要想说明的是:如果一个Decimal 变量值是1.1230  那么在tostring 后 他就是"1.1230"
    如果他是这个"1.123" 那么在tostring 后 他就是"1.123"
    所以说应该不是vb.net 动了手脚.
    另外 小数部分偶数位是它不补零 奇数位时他补零.头疼,为啥呢?
      

  10.   

    y1=1.5
    y2=1.6
    Console.WriteLine((Convert.ToDecimal(y1)  *  Convert.ToDecimal(y2)).ToString()) 
    结果2.40,精度被.NET改变了。
    不知道你的源码实现和测试代码是否完全一致,建议还是检查下.NET代码中的变量取值赋值和打印输出是否不小心改变精度了。
      

  11.   

    如果觉得多了0,在显示的时候指定format哟。浮点的数据就是这样的。
      

  12.   

    可以确定 vb.net 没有做改变精度的事情
    他就是做了个object.tostring 的事情