15%, obwohl nur 114gm?

Ey alda.. 15%, fick Dich und Deine Seite... So oder so aehnlich, hoert man's oft. (Gut, "Dich" und "Dein" klein, es heisst ja auch nicht "Sie Arschloch" sondern "sie ArschLOch".) Was sie damit faekalwortlos ausdruecken moechten ist, dass sie die Glaubhaftigkeit dieser Seite anzweifeln, weil sie in freewar selber noch nie "15%" gesehen haben.

Dabei isses recht einfach, das zu sehen, sobald man nicht einen Kristall der Heilung benutzt, sondern was teureres. Bleistiftsweise nen gruenen Kugelschneider, ne Statue von Horikon oder ne (damalige) Endwaffe (jetzt Rassenendwaffe).

14%15%
gruener Kugelschneider153900 155250
Spiegel der Markthalle 31350 31624
Diamantharnisch 9690 9775
Rubin 316 319
Kristall der Heilung 114 114

Nimmt man sowas wie oben und klickt in einem 15% shop auf verkaufen, kommt beim gruenen Kugelschneider, 155250 raus, bei nem 14% shop 153900. Bei nem Mahaspiegel sind 15% 31624, 14% dagegen 31350; Diamantharnisch 15% 9775, 14% 9690, selbst Rubin 15% 319, 14% 316...
Annesrum gesehen rechnet es sich so... Rubin kost 555/2 bei 100% →
319/(555/2)=1.149549549
315/(555/2)=1.138738738
sprich... kommt hin.
Wer's ausprobieren will... hier in perl, php iss aehnlich

#! /usr/bin/perl
use strict;
use warnings;

use POSIX qw(floor);

my @q = ("gruener Kugelschneider", 270000,
        "Spiegel der Markthalle", 55000,
                "Diamantharnisch", 17000,
                "Kristall der Heilung", 200,
                "Rubin", 555,
                );

my $ml = 0;
my $t = 0;

for(my $i = 0; $i < @q; $i += 2)
{
        $t = length($q[$i]);
        $ml = $t if ($t > $ml);
}


for(my $i = 0; $i < @q; $i += 2)
{
        printf("%${ml}s 14%%: %6d 15%% %6d\n",
                $q[$i], floor(1.14*$q[$i+1]/2), floor(1.15*$q[$i+1]/2));
}

for(my $i = 198; $i < 202; $i ++)
        printf("price %d -- 14%%: %6d 15%% %6d\n",
                $i, floor(1.14*$i/2), floor(1.15*$i/2));
}

my $i = 200;
while(
        sprintf("%d", floor(1.14*$i/2))
                eq
        sprintf("%d", floor(1.15*$i/2))
){
        printf("14%%: %6d 15%% %6d\n",
                floor(1.14*$i/2), floor(1.15*$i/2));
        $i++;
}
print("floor(1.14*$i/2) != floor(1.15*$i/2)!\n");
print(floor(1.14*$i/2) . " != " . floor(1.15*$i/2) . "\n");

Weiterhin gibts fuer die immer noch unglaeubigen selbst/sogar im freewar wiki einen Artikel dazu. Shopsystem erklaert zwar mittlerweile ohne IEEE Floating Point Darstellungs-Hinweis, dass, so wie freewar.de im Moment rechnet, bei so krummen Zahlen bei 100*1.14 das gleiche rauskommt wie bei 100*1.15; hoert sich seltsam an, iss aber so. Computer sind halt nu ma doof und 1.14 iss fuer den Computer halt viel schoener als so was ungerade seltsames wie 1.15 (115 hat uebrigens nur die Primfaktoren 5 und 23. wenn das mal nichts heisst :).

Vorstellen kann man sich das so, dass wir ja im 10er System rechnen. Fuer uns iss sowas wie "mal 10", "mal "1000" oder so kein Problem. wir haengen da einfach null-en hinten an. 10*100.. kein Thema.. 10 und zwei nuller dran macht "10 00", also tausend. Selbst bei 13458072*1000000000 kommt man nicht so schnell ins Straucheln. Man zaehlt die nullen ab (es sind ... 9, also 10^9, 109also 10*10*10*10*10*10*10*10*10), also haengt man 9 0-en an die 13458072 and und kommt auf 13458072000000000. Grosses Zahl... zugegeben. Worauf will der raus? Der Computer rechnet aber nich im 10er System, sondern im 2er System. Der hat also als "Zeichenvorrat" nich 0123456789 sondern nur 01. Was heisst das fuer den? er kann alles mit 2 super gut. "*2", "mal 4" oder "mal 1024" (das iss 2^10 (210), also 2*2*2*...*2*2*2) iss fuer den kein Problem. der haengt auch nur 0en an, wenn er das Rechnen muss. Was will uns das sagen? Der Rechner kann 114 viel viel besser darstellen als 115, weil 114 gerade iss und er mit zweier-Potenzen (das iss nix verperses) viel besser umgehen kann. Drum stellt er 115/100 als nicht 1.15 dar, sondern als 1.14+Rest und das poese abrunden macht dann den Rest zu nichte. Dumm gelaufen.