热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lua脚本精度

每日一坑实习的第一段代码由lua脚本开始,不意外的被坑,搜了好多资料页没找到解决方法,那我就自己来填一下这个坑 问题描述:127.0.0.1:6379keys*(emptylis

每日一坑

实习的第一段代码由lua脚本开始,不意外的被坑,搜了好多资料页没找到解决方法,那我就自己来填一下这个坑

 

问题描述:

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> hset fruits apple 1.5
(integer) 1
127.0.0.1:6379> hset fruits orange 2
(integer) 1
127.0.0.1:6379> hset fruits pear 7
(integer) 1
127.0.0.1:6379> hvals fruits
1) "1.5"
2) "2"
3) "7"

在redis里定义了三个hash域的值,代码如上. 

 

然后通过java执行了lua脚本返回结果

// 执行 lua 脚本
DefaultRedisScript redisScript = new DefaultRedisScript<>();
// 指定 lua 脚本
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("SDK_lua/test/mytest.lua")));
// 指定返回类型
redisScript.setResultType(Object.class);
List keys = new ArrayList<>();
// 参数一:redisScript,参数二:key列表,参数三:arg(可多个)
Object result = wmsGoodsInfoStringRedisTemplate.execute(redisScript, keys, "");
System.out.println(result);

 

mytest.lua的内容

return redis.call('hvals','fruits')

 

返回结果也是合理的

 

 

但是!!当我在lua脚本里计算返回的时候却发现了问题

 

修改mytest.lua如下

local quality = 0
local arrayValues = redis.call('hvals','fruits')
for index, value in ipairs(arrayValues) do
quality = quality + value
end
return quality

 

上面redis.call('hvals','fruits')返回了[1.5,2,7]

现在居然给我返回了10

 

 

 

然后开始查资料模式操作

像这样,

local quality = 0
local arrayValues = redis.call('hvals','fruits')

for index, value in ipairs(arrayValues) do
local tempVal = tonumber(value)
local nTemp = tempVal * 100
local nVal = tonumber(string.format("%.2f", nTemp / 100
))
quality = quality + nVal
end
return quality

 

这样,

local quality = 0.0
local arrayValues = redis.call('hvals','fruits')
for index, value in ipairs(arrayValues) do
quality = quality + value*1
end
return quality

 

以下省略千行代码

 

最终老大看不过去来操作,解决了问题

 

local quality = 0
local arrayValues = redis.call('hvals','fruits')
for index, value in ipairs(arrayValues) do
quality = quality + value
end
return quality..""

 

然后我好奇又加了几位小数

127.0.0.1:6379> hset fruits banana 3.4562784
(integer) 1
127.0.0.1:6379> hvals fruits
1) "1.5"
2) "2"
3) "7"
4) "3.4562784"

再次执行

 

 

!!!!!震惊!!!!!

 

我对比了一下

local quality = 0
local arrayValues = redis.call('hvals','fruits')
for index, value in ipairs(arrayValues) do
quality = quality + value
end
return quality

=============分割符==========

local quality = 0
local arrayValues = redis.call('hvals','fruits')
for index, value in ipairs(arrayValues) do
quality = quality + value
end
return quality..""

 

就这?好吧,我成长了——

 



推荐阅读
author-avatar
欧拉阿拉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有