请问四舍六入五留双,下面是什么意思?!(50)

  • 主题发起人 主题发起人 楚辞
  • 开始时间 开始时间

楚辞

Unregistered / Unconfirmed
GUEST, unregistred user!
function TForm1.myround(source: string): string;var x: integer; gettail: string;begin if Int(StrToFloat(source)) < 1 then x := 7 else x := 6;//这是网友帮助写的,我不理解,取整<1,然后x:=7或者x:=6,给7,6于x, 是什么意思? result := IntToStr(Length(source)); case StrToInt(source[x]) of 6..9: source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1]; 5: begin gettail := Copy(source, x + 1, Length(source) - x + 1); if StrToInt(gettail) > 0 then source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1] else if StrToInt(source[x - 1]) mod 2 = 1 then source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1]; end; end; result := Copy(source, 1, x - 1);
 
哦.明白了.6与7代表有6到7个数.
 
6..9: source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1];//这句是什么意思?6..9代表什么?![1] 是什么意思?
 
不明白是不?6..9表示如果 StrToInt(source[x]) 为 6、7、8、9 中的任何一个数时都执行 source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1];还有不明白的就用 ShowMessage 把它 Show 出来。
 
function TForm1.myround(source: string): string;var x: integer; gettail: string;begin if Int(StrToFloat(source)) < 1 then x := 7 else x := 6;//如果原数小于1时,则对第7位数进行判断,大于1时则取第6位判断,这么定是跟据你的贴子要求来的。看下面示图,希望你能领悟。[blue]位 1 2 3 4 5 6 7 8[/blue] 0 . 1 1 1 1 [red]1[/red] 1 => 0.1111 1 . 1 1 1 [red]1 [/red]1 1 => 1.111 1 1 . 1 1 [red]1[/red] 1 1 => 11.11 1 1 1 . 1 [red]1[/red] 1 1 => 111.1 1 1 1 1 . [red]1[/red] 1 1 => 1111 注意上图中红色1的规律,即大于1的数都是对第六位的数进行判断来决定是否进位。而小于1的数则要对第七位进行判断。所以才有上面的语句。[red] result := IntToStr(Length(source));此句无意义,是我测试时候用过的,忘了删了[/red] case StrToInt(source[x]) of //对第6或是7位的数据进行判断 6..9: source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1];当判断位的数值为6-9[red]即大于6[/red]中的任意一个数时,直接进位。 5: begin 当判断位数的值为5时,进行下面的判断 gettail := Copy(source, x + 1, Length(source) - x + 1); 取5后的所有数 if StrToInt(gettail) > 0 then source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1] 当5后还有非0值时直接进位,否则进行下面的判断 else if StrToInt(source[x - 1]) mod 2 = 1 then source[x - 1] := IntToStr(StrToInt(source[x - 1]) + 1)[1];5后有非0值时判断5前一位是否为奇数,为奇数时进位 end; end; 你还有个疑问就是,我为什么没有对1-4进行判断,再就是为什么没有对5后非0时进行偶数判断。是因为它几种条件都是不进位的,所以我就不用管它直接截取就可以了。只要把进位操作好就可以了。 result := Copy(source, 1, x - 1);其实你的那个要求很简单,画个简单的流程图就可以很快的把程序写出来。你那个贴提的要求,那些回贴的大大们说就是银行家用的四舍六入五留双,你的也确实是那样的。但你的多出一个条件。即判断位为5时还要考虑其后是否还有非零值。银行家算法时没有这个条件,所以我认为你的要求用delphi的round无法完成。如果是标准的银行家算法的话delphi的round就可以胜任。
 
太谢谢各位FW朋友了.早知道多放些分了....没有想到还能遇到你们....
 
source[x - 1]) 所有语句中这句不明白.原数减1怎么理解?source[x - 1]) + 1)连起来,我知道这句是直接进一位的意思.还有[1],是[red]1即读1的意思.这个我的理解对否? 请再看看....
 
比如说,12.6455, 因为原数大于1时则取第6位判断,即对第一个5进行判断,(小数点算不算一位?这个我理解算一位....)应该执行gettail := Copy(source, x + 1, Length(source) - x + 1); 译出来:gettail := Copy(12.6455,(5+1),length(取整)12-5+1);即最后等于copy(12.6455,6,8);不知最后的结果对否?请Vsun,看看....
 
gettail := Copy(source, x + 1, Length(source) - x + 1); 译出来:gettail := Copy('12.6455',x+1,length('12.6455')-x+1);由于12.6455大于1则x值为6,所以,代入x值:gettail:=copy('12.6455',6+1,length('12.6455')-6+1);length('12.6455')返回长度为7,代入:gettail:=copy('12.6455',6+1,7-6+1);gettail:=copy('12.645[red]5[/red]',7,2);即gettail的值为5,取的就是上行中的红色5。晕死了,像在做数学证明题一样,楼主的逻辑思维能力好差啊,还是没有仔细看代码?
 
应该是逻辑思维能力差.,可能是代码写的少............谢谢,vsuns给予的帮助!
 

Similar threads

I
回复
0
查看
829
import
I
I
回复
0
查看
525
import
I
I
回复
0
查看
883
import
I
后退
顶部