范围极限靠近:)

  今天继续撸一个下载器的时候, 一个 progressbar 控件报 Maximum 超限了

调试看了下,真的会超,Maximum 属性 是 int32 的,但是数据可能会是 long (int64),超限了就会导致崩溃。

 

Lv1:

开始就想着 value/10000 好了

max = org_MaxValue / 10000;
cur = org_CurValue / 10000;
//得到 max 和 cur

 然后想想 觉得 不保险,存在bug,不能就这么算了。

 

Lv2:

因为不知道会超多少, 10000 作除数肯定不保险。

弄个循环判断多少位吧

复制代码
int n = 0;
long max = org_MaxValue;
while(max < int.MaxValue){
    max /= 10;
    n++;
}
long cur = org_CurValue;
while(n > 0){
    cur /= 10;
    n--;
}
//得到 max 和 cur
复制代码

 emmmmm,貌似可行的。

但是这样感觉就有点复杂了吧?!

再想想,怎么简单点!

 

Lv3:

然后尝试 用 int.MaxValue 和 long.MaxValue 计算 

42949672963 / 2147483648 = 20.000000001396984
42949672963 / 21         = 2045222522.047619

唉!

2045222522.047619

比 

2147483648

 小唉,

 

 除以 int.MaxValue ,然后向上取整, 或者 取整再加一 作为除数,就能得到肯定比 int.MaxValue 小的数了,

那 cur 的计算等比缩小, 也用 org_CurValue 除以前面的 结果就能得到了。

OK , 可以。

int c = org_MaxValue / int.MaxValue + 1; //或者: Math.Ceiling(org_MaxValue / int.MaxValue)
max = org_MaxValue / c;
cur = org_CurValue / c;
//得到 max 和 cur

然后吧,看着这一除 一除 的,瘆得。

 不就是:`\frac{x}{\frac{x}{y}+1}`

              

 这个公式么。

 然后:`\frac{x}{\frac{x}{y}+1}=\frac{xy}{\frac{xy}{y}+y}=\frac{xy}{x+y}`

              

 所以就有了一个算法了? :)

验证:  

//int.MaxValue=2147483648
//long.MaxValue=9223372036854776000

4294967296*2147483648/(4294967296+2147483648) = 1431655765.3333333 18446744073709552000*2147483648/(18446744073709552000+2147483648) = 2147483647.75 2147483647.75-2147483648 = -0.25 2147483648*2147483648/(2147483648+2147483648) = 1073741824

 

Lv4:

 整理下:

max =(int)(org_MaxValue * int.MaxValue / (org_MaxValue + int.MaxValue));
cur =(int)(org_CurValue * int.MaxValue / (org_CurValue + int.MaxValue));

这样 就整整齐齐了:)

 

 参考:

手写公式转LaTex

 数学公式在线编辑器

(PS: 手写的确很强大, 公式代码复制到在线编辑器, 就能从其html代码里面拷贝到一个在线公式图片)

(PS: 写完了本篇折腾公式显示才发现博客园已经内置了数学公式支持了)



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。 原文链接:https://www.cnblogs.com/lzpong/p/16216622.html
posted @   _Ong  阅读(43)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2018-05-02 FreeSWITCH 客户端fs_cli连接设置(acl)
点击右上角即可分享
微信分享提示