Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Funktion Runden geht nicht zu 100 Prozent


  • Please log in to reply
20 replies to this topic
jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
Was soll die Funktion machen:
- Wenn ganze Zahl ohne Dezimalstelle (z.B. 5, 20, 163) dann bleib
- Wenn Zahl mit Dezimalstelle < 1000 (z.B. -1.12, 754.132) dann Runde auf 4 Stellen
- Wenn Zahl mit Dezimalstelle > 1000 (z.B. -1532.12, 2633.131) dann Runde auf 2 Stellen

Problem:
Bei Rechnungen mit * funktioniert es das die ganze Zahl als Integer erkannt wird.
Bei Rechnungen mit / funktioniert es nicht das die ganze Zahl als Integer erkannt wird.

MsgBox, % RoundByResult(20 * 20)
MsgBox, % RoundByResult(20 / 20)

RoundByResult(result)
{
	if result is Integer
	{
		return, result
	}
	else
	{
		if result between -999 and 999
		{
			return, Round((result), 4)
		}
		else
		{
			return, Round((result), 2)
		}
	}
}

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

Weil 20/20 Nachkommastellen hat

msgbox,% 20/20

Regards,
Babba

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Da in AHK alle Zahlen in strings umwandelbar sind kannst du RegExMatch verwenden (die kurzform.) .

z.B.

If (Zahl~="\d+")

Entspricht deiner ersten If abfrage.

Und das hier:

IF (((Zahl**2)**05)<999)

Deiner zweiten

 

Allerdings musst du um auf dein gewünschtes Ergebnis zu erhalten den RegExMatch anpassen.

RegExMatch(Zahl,"\d+.?(\d*)",Nachkomma)
If (Nachkomma1!="")
Nachkomma:=RegExReplace(Nachkomma1,"0*$")
If (Nachkomma="")
;integer

Visit the new forum ahkscript.org.

http://ahkscript.org


jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012

@Babba

ja schon...

aber 20*20 macht er 400

dann sollte doch eigtl auch logisch sein das 20/20, 1 ist und nicht 1.00000


[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Eigentlich schon.


Visit the new forum ahkscript.org.

http://ahkscript.org


garry
  • Spam Officer
  • 3219 posts
  • Last active: Sep 20 2018 02:47 PM
  • Joined: 19 Apr 2005

example

setformat,float,0.0
a:=(20/20)        ;-  ohne kommastellen
a:=163            ;-  ohne kommastellen
a:=754.1354321    ;-  if <1000   4-stellen runden
;a:=2754.135      ;-  if =>1000  2-Stellen runden

c:=floor(a)
if (a=c)         ;- ohne kommastellen
  {
  msgbox,%a%
  return
  }
else
  {
  stringlen,L,c
  L:=L
  if (L<4)        ;-- less then 1000
     {
     setformat,float,0.4
     a:=floor(a*10000+.5)/10000
     msgbox,%a%
     return
     }
  else
     {
     setformat,float,0.2
     a:=floor(a*100+.5)/100
     msgbox,%a%
     return
     }
  }
return




strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

AHK benutzt für / Float Arithmetik und lässt es dich wissen. Nullen wegschneiden ist aber einfach:

msgbox,% regexreplace(20/400,"\.?0++$")

Regards,
Babba

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
@garry:
Mit "a := % 20/20" geht dein Script genauso wenig wie meins
Ergebnis ist "1.000000"
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

garry
  • Spam Officer
  • 3219 posts
  • Last active: Sep 20 2018 02:47 PM
  • Joined: 19 Apr 2005

script oben angepasst



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
funktioniert trotzdem nur teilweise..
Er würde jetzt alles auf volle aufrunden.

Das ganze soll als Funktion dienen...
Logischerweise müsste ja meine Funktion oben funktionieren, wenn da das nicht mit dem / und .000000 wäre

z.B.

20*20 ==> 400 (Ganze Zahlen - keine Nachkomma-Stellen)
20/20 ==> 1 (Ganze Zahlen - keine Nachkomma-Stellen)
X*X = < 1000 ==> 1234.562346 ==> 1234.56 (2 Nachkomma-Stellen)
X/X = > 1000 ==> 123.4567123 ==> 123.4567 (4 Nachkomma-Stellen)

FuncZumRunden(20*20)
FuncZumRunden((X*X)/X)
usw
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
@Babba
ich hab mit regex noch nicht viel am Hut, allerdings löscht er auch Nullen vor dem Komma(Punkt)

20*20 = 4 in dem Beispiel

MsgBox, % RoundByResult(20 * 20)
MsgBox, % RoundByResult(20 / 20)

RoundByResult(result)
{
	result := % regexreplace(result,"\.?0++$")
	if result is Integer
	{
		return, result
	}
	else
	{
		if result between -999 and 999
		{
			return, Round((result), 4)
		}
		else
		{
			return, Round((result), 2)
		}
	}
}

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Ich werde hier knallhart übergangen :D.


Visit the new forum ahkscript.org.

http://ahkscript.org


MKH
  • Members
  • 26 posts
  • Last active: Aug 06 2013 04:46 AM
  • Joined: 01 May 2013

@nnnik

und das mit aller Gewalt *rofl*

 

probier doch mal das aus

MsgBox, % RoundByResult(20 * 20)
MsgBox, % RoundByResult(20 / 20)

RoundByResult(result)
{
	if result is Integer
	{
     SetFormat, Float, .0
		return, result
	}
	else
	{
		if result between -999 and 999
		{
         SetFormat, Float, 0.4
			return, Round((result), 4)
		}
		else
		{
         SetFormat, Float, 0.2
			return, Round((result), 2)
		}
	}
}


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
ich hab mit regex noch nicht viel am Hut, allerdings löscht er auch Nullen vor dem Komma(Punkt)

Ja, da kennt er nix;)
Aber ne, bei mir funzt es auf Zahlen mit einem "." .

arr := [200, -300.0, 400.01000]
for _,v in arr
    msgbox,% regexreplace(v/1,"\.?0++$")

Regards,
Babba

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
@MKH:
funktioniert auch nicht
siehe "MsgBox, % RoundByResult(10 / 20)"

@Babba:
funktioniert auch nicht
siehe aktuellen Stand

MsgBox, % RoundByResult(20 * 20)
MsgBox, % RoundByResult(20 / 20)
MsgBox, % RoundByResult(10 / 20)

RoundByResult(result)
{
	;result := % RegExReplace(result, "\.\d*[^0]\0*$|\.0*$")
	;result := % RegExReplace(result, "\.?0+$")
	if result is Integer
	{
		return, result
	}
	else
	{
		if result between -999 and 999
		{
			return, Round((result), 4)
		}
		else
		{
			return, Round((result), 2)
		}
	}
}
@übergangender nnnik grin.png
Kannst du mir dein bsp mal genauer ans herz legen D:
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you