jQuery MiniUI

标题: json反序列化之后小数四舍五入 [打印本页]

作者: q123126    时间: 2014-4-14 16:05:29     标题: json反序列化之后小数四舍五入

div field="xxx" decimalplaces="3" datatype="float" headeralign="center" align="right">
                                </div>
用getData()提取数据到后台,用json.net反序列化为datatable的时候,如果第一行的数字是0.000或者1.000这样的整数,那么当前列会被认为是整数,所有的小数会被四舍五入为整数。


作者: lost    时间: 2014-4-14 16:16:06

json对数据是不会做处理的,你原本数据多少,就是多少,数据的处理只能放到后期去处理.
作者: q123126    时间: 2014-4-14 16:30:13

lost 发表于 2014-4-14 16:16
json对数据是不会做处理的,你原本数据多少,就是多少,数据的处理只能放到后期去处理. ...

数据库的数据是有小数的,但是经过了grid之后,再取就会变成没有小数了,grid能怎么设置,让getData取到的数是decimalplace这么多个小数的。这样序列化就不会有问题了。
作者: factory    时间: 2014-4-14 16:43:03

q123126 发表于 2014-4-14 16:30
数据库的数据是有小数的,但是经过了grid之后,再取就会变成没有小数了,grid能怎么设置,让getData取到 ...

表格有显示和数据2部分.我们的保留是对显示的处理,但是用户的原始数据我们肯定不会轻易做改动的.

也就是用户给我们什么,就是什么,如果你非得要数据上保留,那你应该自己处理完了,再把保留后的数据返回给表格
作者: q123126    时间: 2014-4-14 16:47:30

factory 发表于 2014-4-14 16:43
表格有显示和数据2部分.我们的保留是对显示的处理,但是用户的原始数据我们肯定不会轻易做改动的.

也就是 ...

那就奇怪了,我取到的getData就已经是变化了。
作者: factory    时间: 2014-4-14 17:14:16

q123126 发表于 2014-4-14 16:47
那就奇怪了,我取到的getData就已经是变化了。

你这样,你用firebug或者其他的浏览器工具,看看,是不是你后台返回的时候的数据,就已经是被保留过小数了
作者: q123126    时间: 2014-4-14 17:45:28

factory 发表于 2014-4-14 17:14
你这样,你用firebug或者其他的浏览器工具,看看,是不是你后台返回的时候的数据,就已经是被保留过小数了 ...

检查过了,数据库我是默认4位小数,没有特殊处理,显示3位小数,是decimalPlace设置的。
然后提交,得到得json字符串如下
[{"barcode":"PKCC048","gold_no":"","stone_no":"21","kind_no":"05","goodsmode":"5","qty":1,"store_qty":1,"oldbarcode":"PKCC048","prod_name":"xxx","goods_wgt":0,"sale_amt":0,"_id":4736,"_uid":4736,"_state":"added"}]

所有数字类型应该都是四位小数,但是这里的goods_wgt变成了0,其他数值类型也是一样。结果再反序列化的时候,就出问题了。只要小数后有数字的都没有了。
作者: factory    时间: 2014-4-14 17:59:29

q123126 发表于 2014-4-14 17:45
检查过了,数据库我是默认4位小数,没有特殊处理,显示3位小数,是decimalPlace设置的。
然后提交,得到 ...

"_state":"added"

你这条数据是新增的,所有的数据必定是你给他的, goods_wgt这个值你是怎么设置的?
作者: q123126    时间: 2014-4-14 18:11:07

本帖最后由 q123126 于 2014-4-14 18:22 编辑
factory 发表于 2014-4-14 17:59
"_state":"added"

你这条数据是新增的,所有的数据必定是你给他的, goods_wgt这个值你是怎么设置的? ...

               grid1.setUrl('xxx');
                grid1.load(param);
json数据我检查过了没问题。什么都不改变的情况下,
mini.encode(grid1.getData())就已经变了。
作者: lost    时间: 2014-4-14 18:21:58

q123126 发表于 2014-4-14 18:11
grid1.setUrl('xxx');
                grid1.load(param);
json数据我检查过了没问题。 ...

把你的表格页面提供下再提供几条数据,我们看下
打包在高级模式下上传
作者: q123126    时间: 2014-4-14 18:35:07

lost 发表于 2014-4-14 18:21
把你的表格页面提供下再提供几条数据,我们看下
打包在高级模式下上传

由于页面比较复杂,我就只是贴上表格以及相关的代码
  1.                     <div id="datagrid1" idfield="barcode" class="mini-datagrid" style="width: 100%; height: 100%;"
  2.                         virtualscroll="true" showpager="false">
  3.                         <div property="columns">
  4.                             <div type="indexcolumn">
  5.                             </div>
  6.                             <div field="barcode" headeralign="center">
  7.                                 barocde</div>
  8. <div field="goods_wgt" decimalplaces="3" datatype="float" headeralign="center" align="right">
  9.                                 goods_wgt</div>
  10.                             </div>
  11.                     </div>
复制代码
通过一个按钮触发加载数据
  1.             $('#btnBegin').click(function() {
  2.                 grid1.setUrl('xxx');
  3.                 grid1.load(param);
  4.             });
  5. //此处实际加载数据可以参考
  6. //[{"barcode":"0000000770323","goods_wgt":0.0000},{"barcode":"0000000770324","goods_wgt":0.5000}]
  7. //特别要注意的是,加载的数据第一行的数值字段是0.0000
复制代码

然后不用操作,直接获取数据
var data = mini.encode(grid1.getData());//这个时候第二行的goods_wgt不再是0.5。




作者: factory    时间: 2014-4-15 09:42:13

q123126 发表于 2014-4-14 18:35
由于页面比较复杂,我就只是贴上表格以及相关的代码
通过一个按钮触发加载数据
你说的是这样的小数啊...

0.5000这种的后面的零,JS本来就是会没有的.

你可以自己试下,alert(0.5000),看看他弹出的结果是0.5,还是0.5000
作者: q123126    时间: 2014-4-15 10:02:01

本帖最后由 q123126 于 2014-4-15 10:06 编辑
factory 发表于 2014-4-15 09:42
你说的是这样的小数啊...

0.5000这种的后面的零,JS本来就是会没有的.

是的,可能是我没说清楚。
不是小数的问题,比如第一行是0.0000,会被认为是0,那么第二行的0.5000也会按照整数处理,也变成了0。也就是后面所有的数据都是按照第一行的数据类型来算。我举例这个数据有点特殊,如果第二列是3.18,那么处理后的结果就是3。不知道这样说清楚了没
作者: felt    时间: 2014-4-15 10:12:36

q123126 发表于 2014-4-15 10:02
是的,可能是我没说清楚。
不是小数的问题,比如第一行是0.0000,会被认为是0,那么第二行的0.5000也会按 ...

[attach]4295[/attach]
没变0,还是0.5


作者: q123126    时间: 2014-4-15 10:26:30

felt 发表于 2014-4-15 10:12
没变0,还是0.5

不好意思,都被弄糊涂了,不是说这里返回不对,是因为这里返回的第一行是整数0,所以json.net反序列化的时候,goods_wgt列就被认为是整数,导致当前列的后面所有行的小数都被去掉了。不知道这个怎么解决。
作者: factory    时间: 2014-4-15 11:16:19

q123126 发表于 2014-4-15 10:26
不好意思,都被弄糊涂了,不是说这里返回不对,是因为这里返回的第一行是整数0,所以json.net反序列化的时 ...

goods_wgt不是还是0.5吗?没变整数啊
作者: q123126    时间: 2014-4-15 11:28:47

factory 发表于 2014-4-15 11:16
goods_wgt不是还是0.5吗?没变整数啊

mini.encode的时候没有变,但是这里第一行的goods_wgt已经变成了整数0,而不是本身的0.0000,导致提交给后台程序的时候把goods_wgt整列都认为是整数了。第二行的0.5就会变成0.
作者: factory    时间: 2014-4-15 11:32:54

q123126 发表于 2014-4-15 11:28
mini.encode的时候没有变,但是这里第一行的goods_wgt已经变成了整数0,而不是本身的0.0000,导致提交给 ...

还是没明白,encode是从你getData()获取出来的数据而来的,encode没变,自然getData()也是没变

getData()没变,那么数据就是没变.

而且我逐步断点调试,自始至终一直都是0.5

我不知道你说他变成0,是从哪个依据上说的
作者: q123126    时间: 2014-4-15 11:38:51

factory 发表于 2014-4-15 11:32
还是没明白,encode是从你getData()获取出来的数据而来的,encode没变,自然getData()也是没变

getData()没 ...

我给的实例数据不是2行吗,第一行本身的数据是0.0000,第二行是0.5000.
getdata的时候0.0000变成了0,就是想这里不变,或者保持decimalplaces的小数位数。不然这一列变成整数了。
作者: factory    时间: 2014-4-15 13:14:24

q123126 发表于 2014-4-15 11:38
我给的实例数据不是2行吗,第一行本身的数据是0.0000,第二行是0.5000.
getdata的时候0.0000变成了0,就是 ...

我已经告诉你了,小数点后面,没有意义的0,不管是0.500还是0.0000
都会被舍弃掉, 这个JS本身就是如此
作者: q123126    时间: 2014-4-15 16:36:21

factory 发表于 2014-4-15 13:14
我已经告诉你了,小数点后面,没有意义的0,不管是0.500还是0.0000
都会被舍弃掉, 这个JS本身就是如此 ...

其实我的意思是
[{"barcode":"0000000770323","goods_wgt":0.0000},{"barcode":"0000000770324","goods_wgt":0.5000}]加载的数据是这样的
mini.encode之后的数据是这样的
[{"barcode":"0000000770323","goods_wgt":0},{"barcode":"0000000770324","goods_wgt":0.5}]

反序列化之后的数据会是这样的
barcode             goods_wgt
0000000770323    0
0000000770324    0
miniui这样处理没错,因为js本身就是这样处理。只是我这个这样用不行了。不知道有没有其他人碰到这个问题,怎么解决的。
作者: factory    时间: 2014-4-15 16:55:18

q123126 发表于 2014-4-15 16:36
其实我的意思是
[{"barcode":"0000000770323","goods_wgt":0.0000},{"barcode":"0000000770324","goods_w ...

[attach]4303[/attach]

这个是后台获取到前端发送过来的encode之后的表格数据

然后后台decode之后的数据,0.5依旧是0.5,不会因为上面一条数据变成0,也变成了0


作者: q123126    时间: 2014-4-15 17:00:25

本帖最后由 q123126 于 2014-4-15 17:05 编辑
factory 发表于 2014-4-15 16:55
这个是后台获取到前端发送过来的encode之后的表格数据

然后后台decode之后的数据,0.5依旧是0.5,不会因 ...

哦,为什么我的会呢,用的json.net.奇怪。。。

作者: factory    时间: 2014-4-15 17:06:45

q123126 发表于 2014-4-15 17:00
哦,为什么我的会呢,用的json.net.奇怪。。。

我这个就是后台的,用的json.cs的json序列化和反序列化
作者: q123126    时间: 2014-4-15 17:08:39

factory 发表于 2014-4-15 17:06
我这个就是后台的,用的json.cs的json序列化和反序列化

能看看你的json.cs吗。
作者: felt    时间: 2014-4-15 17:09:56

q123126 发表于 2014-4-15 17:08
能看看你的json.cs吗。

试用包里有app_Code/Utils/JSON.cs
作者: q123126    时间: 2014-4-15 19:05:40

felt 发表于 2014-4-15 17:09
试用包里有app_Code/Utils/JSON.cs

测试过了
[{"barcode":"0000000770323","goods_wgt":0},{"barcode":"0000000770324","goods_wgt":0.5}]
这样的json是到不到你截图的效果的,json.cs也是一样。结果2条数据都会是0,是不是你们得到的json数据和这个不一样。

作者: factory    时间: 2014-4-16 09:24:49

q123126 发表于 2014-4-15 19:05
测试过了
[{"barcode":"0000000770323","goods_wgt":0},{"barcode":"0000000770324","goods_wgt":0.5}]
...

我上面截图不就是正常的吗?就是后台调试的截图
作者: q123126    时间: 2014-4-16 09:29:33

factory 发表于 2014-4-16 09:24
我上面截图不就是正常的吗?就是后台调试的截图

我用我给的这2条数据,用json.cs解析不出来正常的。你试试用我这个数据,这都是grid提交的。看看你那边生成的json字符串是什么样的呢
作者: factory    时间: 2014-4-16 09:31:10

q123126 发表于 2014-4-16 09:29
我用我给的这2条数据,用json.cs解析不出来正常的。你试试用我这个数据,这都是grid提交的。看看你那边生 ...

我用的就是你给的数据啊.原封不动,前台encode,后台decode
结果就是上面截图
作者: q123126    时间: 2014-4-16 09:33:51

本帖最后由 q123126 于 2014-4-16 09:35 编辑
factory 发表于 2014-4-16 09:31
我用的就是你给的数据啊.原封不动,前台encode,后台decode
结果就是上面截图

就是奇怪了,我用这个数据,同事都帮忙测试了,结果都会把0.5变成0,测不出来你这个效果。。。json.net版本也是实例里面的。
帮忙试试这样。看数据对不对。
Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>("[{\"barcode\":\"0000000770323\",\"goods_wgt\":0},{\"barcode\":\"0000000770324\",\"goods_wgt\":0.5}]")

作者: factory    时间: 2014-4-16 09:36:10

q123126 发表于 2014-4-16 09:33
就是奇怪了,我用这个数据,同事都帮忙测试了,结果都会把0.5变成0,测不出来你这个效果。。。json.net版 ...

String json = Request["data"];
      
        
ArrayList rows = (ArrayList)Test.JSON.Decode(json);

后台的代码,你看是否跟你一样,

前台是

var data = grid.getData()
var json = mini.encode(data)
$.ajax({
    url: "../data/AjaxService.aspx?method=SaveEmployees",
    data:{data:json}
})

表格的数据就是你前面贴给我的2条数据,没有做过任何变动
作者: q123126    时间: 2014-4-16 09:37:57

factory 发表于 2014-4-16 09:36
String json = Request["data"];
      
        

哦,你用的arraylist,不是datatable,那我试试看。
作者: factory    时间: 2014-4-16 09:39:05

q123126 发表于 2014-4-16 09:37
哦,你用的arraylist,不是datatable,那我试试看。

getData()传过去的是数组.所以反序列化出来用的arraylist
作者: q123126    时间: 2014-4-16 09:40:39

factory 发表于 2014-4-16 09:39
getData()传过去的是数组.所以反序列化出来用的arraylist

那我先转成arraylist再转datatable吧,好像也只能这样了。
作者: q123126    时间: 2014-4-16 10:55:18

factory 发表于 2014-4-16 09:39
getData()传过去的是数组.所以反序列化出来用的arraylist

你好,有arraylist转datatable的方法吗,直接这样转不成功。网上的代码看了。




欢迎光临 jQuery MiniUI (http://miniui.com/discuss/) Powered by Discuz! X2