GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1025134|回复: 82
收起左侧

[技术交流] 一滴"血液"引发的"血案",是谁减掉了那一滴"血液"

    [复制链接] |关注本帖

净化污秽的天照驯化红龙幼崽香喷喷的烤鸡小小安全帽驯化黑龙幼崽幽浮起司煲月影狼妙手空空

    本帖最后由 GMagels 于 2024-4-1 21:49 编辑

    血液祭献换取属性值的时候采取的是向下取整,因此可以通过每次只换取一点属性来保证交的税最小化。前几天楼主发了一篇日志,计算了一下泥潭手动祭献的情况下怎么样选择属性值的数量来少交税。

    在日志中,使用了Excel拉表,根据每个属性值的初始价格,以及税率值15%,计算了不同数量下每点属性值的平均价格,并在最后给出了这样子的结论:
    总结来说,最划算的方式肯定还是每次只兑换1点,除此之外的第二选择旅程和知识是3点,咒术是2点。

    如果只是要避免交最多的税的情况的话,只要注意不要兑换偶数数量的旅程和知识以及4的倍数个咒术就OK了。

    灵魂的税是整数,不存在避税方式,所以请随意兑换XD

    坛友是万能的,在发布日志当天,收到了这样的评论:
    但是一次性兑换3个灵魂只要3449血液,超值折扣,赶快去兑换吧()

    看到这条回复的楼主愣了一下,啊!?这不对吧,怎么会少一滴?1000点血液*15.00%的税率应当缴纳150滴血液税,向下取整也还是150滴血液啊,怎么辉石呢?


    由于楼主在计算的时候只是使用Excel对数字进行计算,并没有真的去页面一个一个数字去试,秉承着“实践是检验真理的唯一标准”,马上就去祭献页面进行了测试.......


    结果...真的是3449....是我血液不够换灵魂的错.....该不会....该不会换三个灵魂真的有特殊折扣吧.....

    虽然可能永远不会血液换灵魂,但是这个东西就像是谜底还没有揭开的你画我猜,一直搞的人心痒痒的。

    于是楼主决定去翻代码,来看看到底是不是折扣。很快便翻到了这句向下取整数量的计算语句:
    1. $('exchangedesamount').value = Math.floor( tocredit.getAttribute('ratio') / fromcredit.getAttribute('ratio') * $('exchangeamount').value * (1 + 0.15));
    复制代码
    仔细研究研究,
    Math.floor

    Math.floor() 是用于向下取整的函数,没什么问题。
    tocredit.getAttribute('ratio') / fromcredit.getAttribute('ratio')

    两个属性的比例值这一点也没问题,1000/1 = 1000。
    $('exchangeamount').value * (1 + 0.15))

    最后这个是输入的数量乘上1.15,看着也没有任何问题。
    这就奇怪了,这个结果的计算过程就应该是1000*N*1.15啊,怎么会出现3449这个数字。

    就在这一筹莫展之际,气急败坏的楼主使用了搜索引擎Bing,计算了3000*1.15,然后居然发现:


    没错,搜索引擎居然也给出了3449的答案!(是真的,大家可以自己去试)至此,这场未定的悬案出现了一丝破解谜题的关键线索。

    顺着这条线索楼主又进行了一番搜索,终于找到了减掉这一滴血液的小黑的身份,他就是.....

    BGM:bilibili
    ⬆CODE区不支持内嵌视频或音乐,请打开这个网站来播放BGM,唉嘿!

    没错小黑就是.......JavaScript!
    JS:证据呢,证据!你凭什么说是我扣掉的那一滴血液。

    确实,指证犯人需要确凿的证据,但是今天想要获取证据并不难,楼主悄悄写了几行JS代码并运行,结果如下:

    没错!当乘数为3000,6000,7000,也就是灵魂数为3,6,7时,得出来的结果会比应该的结果少一丢丢,然后再通过向下取整发的方式,就能完美实现少扣一滴血液!

    JS:那作案动机呢?都花3500血液换灵魂了,我为什么还要去减一滴血液?

    经过楼主缜密的调查,JS里的数字是采用 IEEE 754 标准的 64 位双精度浮点数(百度百科链接)。

    JS存储的数字一共由64个0或1组成,这其中,第0位表示"正负"(蓝色),第1-11位存储"指数"(绿色),第12-63位存储"有效数字"(红色)。

    存储有效数字部分的位数是52位,而很不幸,浮点数(带小数的数)的二进制是无限循环的,比方说这次出场的1.15经过二进制转换是:
    1.0010011001100110011001100110011001100110011001100110011......(无限循环)

    在JS存储时,这个无限循环的数只被记了前52位,后面的都被抹掉了。
    正是因为无限循环的数在存储时被抹掉后续的一部分,1.15在这一步中损失了它精度,造成了后续计算在与3000,6000,7000相乘时得出来的数字与本应得出来的结果差了1。

    对此非常感兴趣的也友友可以去这篇知乎专栏了解详细的原因:JavaScript 浮点数运算的精度问题

    终于,一切水落石出,案结。

    第一次在CODE区发帖,如果有误欢迎指正!如果觉得有意思,也欢迎给个免费的追随。

    有代码基础的友友,可以自己运行一下下面这段代码(会弹窗),亲自看一下JS实际运算的结果。
    <script type="text/javascript">
        window.alert("1000*1*(1+0.15) = "+ 1000*1*(1+0.15) +" \n" +
                     "1000*2*(1+0.15) = "+ 1000*2*(1+0.15) +" \n" +
                     "1000*3*(1+0.15) = "+ 1000*3*(1+0.15) +" \n" +
                     "1000*4*(1+0.15) = "+ 1000*4*(1+0.15) +" \n" +
                     "1000*5*(1+0.15) = "+ 1000*5*(1+0.15) +" \n" +
                     "1000*6*(1+0.15) = "+ 1000*6*(1+0.15) +" \n" +
                     "1000*7*(1+0.15) = "+ 1000*7*(1+0.15) +" \n" +
                     "1000*8*(1+0.15) = "+ 1000*8*(1+0.15) +" \n" +
                     "1000*9*(1+0.15) = "+ 1000*9*(1+0.15) +" \n" );
    </script>
    ↑点击第一个按钮即可直接运行(再次提醒:会弹窗XD)

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 22旅程 +1 金币 +10 血液 +51 追随 +18 堕落 +6 收起 理由
    457 + 1
    Aphrodisy + 1
    Nittbone + 1 + 10 + 6 + 1 勇于探索
    白冥 + 1 很给力!
    raccooncop + 3 + 1 + 1 很给力!
    无心gal游戏 + 3
    叶狻猊 + 3 + 1 + 1
    一只随行 + 2 + 1 很给力!
    书の妖怪 + 3 + 1 很给力!
    you9632587 + 1

    查看全部评分

    回复

    使用道具 举报

    百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

      回复

      使用道具 举报

      不曾寄出的信件『随时随地开启!』漂洋小船『随时随地开启!』冒险用指南针破损的旧书丛林的鸟飞走了雪王的心脏人鱼之泪幽灵竹筒

        回复

        使用道具 举报

        20x43 隐形➀吃饱金币的Doge冒险用指南针金牌矿工小小安全帽小小舞台阿拉喵?神灯图腾饼干『梦旅存根』

          回复

          使用道具 举报

          業火死鬥极客的晚宴实现梦想官复原职吃饱金币的Doge月影狼夏日柯基幸福的小阿尔结晶火鹰幼崽

            支持科普咱最开始发现的是换100个灵魂可以“优惠”1血液,最后经提醒得知低至3灵魂就可以实现了(笑)
            但是为什么偏偏是3,6,7而不是其他的数字呢?感觉还是有点不明白,看看楼主给的参考文献吧
            回复

            使用道具 举报

              回复

              使用道具 举报

              希尔瓦娜斯·风行者麦迪文(Medivh).阿尔萨斯‧米奈希尔枯荣明灭卡德加(Khadgar).安杜因·乌瑞恩我的天使夏日柯基幸福的小阿尔吃饱金币的Doge

                回复

                使用道具 举报

                海盗弯钩眼镜蛇图腾知识大典牧羊人TRPG版塊魔法石碑GM論壇勛章

                  回复

                  使用道具 举报

                  神秘商店贵宾卡无瑕的回忆『住在GM村』丹雀衔五穗,人间始丰登霍格沃兹特快列车小丑与格雷与星光璀璨『逆境中的幸运女神』幸运女神的微笑亚瑟‧摩根業火死鬥

                    哇哇哇,牛啊,这科普看完之后还是很惊讶的,有被震惊到,增加了一点点js的小知识,不错哎,这下知道那一滴血为什么没了(但是,3k多血液,这得攒多久)
                    回复

                    使用道具 举报

                    亚索月影狼晓月终焉旅行骰子!卡利亚权杖

                      新知识get,现在新勋章的升级消耗也越来越高了,不知道下次有没有机会试一下一次换三只灵魂
                      回复

                      使用道具 举报

                      实现梦想業火死鬥魔法不朽·传奇不熄卡洛斯·奥利维拉白野威十年一梦官复原职男巫之歌永浴爱河虚空之海的鲸

                        回复

                        使用道具 举报

                        牧羊人森林羊男山猫图腾红龙幼崽腐化龙蛋

                          回复

                          使用道具 举报

                          没有梦想的咸鱼我的天使GM吸血伯爵吃饱金币的Doge阿拉喵?神灯和你一起飞行的皮卡丘小小舞台永浴爱河

                            阿巴阿巴(´×ω×`)虽然看不懂,但大受震撼.jpg
                            嘛~懂了,下次一口气换三个灵魂好了,能省就省
                            回复

                            使用道具 举报

                            森林羊男寻觅牧羊人特殊-家园卫士Ⓛ特殊-家园卫士Ⓡ

                              回复

                              使用道具 举报

                              脉律辐石劫掠核芯御医神兔夏日柯基幽灵竹筒黄金树的恩惠探险三杰士图腾饼干生活拍立得璀璨金币

                                回复

                                使用道具 举报

                                『私有海域』『钜鲸』『星河碎片』『召唤好运的角笛』『交钥匙了!』『矩阵谜钥Ⓖ』十周年扭蛋 - 红『落樱缤纷』红心玉

                                  回复

                                  使用道具 举报

                                  无瑕的回忆『住在GM村』小丑与格雷与星光璀璨劫掠核芯脉律辐石幸运女神的微笑诡异的灵魂石女神之泪卡勒罗斯辉石头罩马克

                                    因为泥潭有批量单点献祭的脚本,发现之后都直接用脚本了,后来也只换咒术没换过别的了
                                    羡慕楼主的求真精神,虽然我看得似懂非懂
                                    当然这3只灵魂的一点血跟我也没有任何关系就对了
                                    回复

                                    使用道具 举报

                                    『召唤好运的角笛』『分析天平』『落樱缤纷』劫掠核芯『伊黎丝的赞词』脉律辐石永远的克叔【夏日限定】夏日的泰凯斯凯登‧阿兰科骑兽之子

                                      回复

                                      使用道具 举报

                                      恶魔城驯化黑龙幼崽沼泽黏附者驯化红龙幼崽近地夜航

                                        夏漏光微 发表于 2024-3-22 21:50:05 手机端 | 显示全部楼层 |取消关注该作者的回复
                                        大学时老师课上讲过这个
                                        不同位数,浮点数的运算会导致意想不到的错误
                                        当时并不明白
                                        后来屡屡在知乎以及其他地方看到匪夷所思的错误只能感叹一句
                                        真的厉害
                                        回复

                                        使用道具 举报

                                        安德鲁·库珀索尔·奥丁森.安德森‧戴维斯.走出失恋阴影的罗罗詹米·多南.

                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2024-12-18 22:16 , Processed in 0.158310 second(s), 142 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表