إضافة أرقام من أعداد صحيحة كبيرة في بوويرشيل
-
03-07-2019 - |
سؤال
عند إضافة أرقام من رقم في بوويرشيل، كل شيء على ما يرام مع الأعداد الصحيحة التي يكون طول -le 29.
$largeInteger = 11111111111111111111111111111 #29 digits sums correctly $sumDigits = 0 $largeInteger while ($largeInteger -ne 0) { $sumDigits += $largeInteger % 10 $largeInteger = [MATH]::Floor($largeInteger /10) } $sumDigits
والامور مثيرة للاهتمام عندما يكون طول عدد -gt 29. وفي الحالة التي يكون فيها طول هو 30، ومجموع = 77.
وأي أفكار؟
المحلول
وسيكون لديك لتثبيت مكتبة bignum. هناك بعض المؤشرات هنا . إما أن أو استخدام المنصة التي لديها bignums بنيت فيها
نصائح أخرى
وأن يكون لديك أكثر من جوا ضعف ما يتم التعامل معها كحالة خاصة من قبل بوويرشيل. كنت قد تحاول $largeInteger = [float]111111111111111111111111111111
. سوف لا تزال تفقد بعض الدقة باستخدام تعويم.
لمزيد من المعلومات، انظر تعويم (C # المرجعي)
وتغيير largeInteger من 29 1 الى 30 1 تغيرات نوع المتغير من عشري إلى مضاعفة. استخدام $ largeInteger.GetType () لمعرفة ذلك.
والرياضيات في الخوارزمية لا تعمل بشكل جيد جدا على الزوجي. تشغيل خطوط 2 في حلقة مرارا وتكرارا على موجه لرؤية القيم في كل خطوة.
وعندما يذهب largeInteger من العشرية لمضاعفة، والحساب ليست دقيقة أي أكثر من ذلك. وهذا هو السبب في أنني اقترح runnning خطوط 2 على موجه.
وهنا هو الإخراج - منتديات
PS C:> $ largeInteger٪ [مزدوجة] 10
8
PS C:> $ largeInteger٪ [مزدوجة] 100
88
PS C:> $ largeInteger٪ [مزدوجة] 1000000000000000000
1.11105501764518E + 17
PS C:> $ largeInteger٪ [مزدوجة] 1000000000000000000000
1.11111105501765E + 20
PS C:> $ largeInteger٪ [مزدوجة] 1000000000000000000000000000
1.11111111111104E + 26
PS C:> $ largeInteger٪ [مزدوجة] 100000000000000000000000000000
1.11111111111111E + 28
PS C:> $ largeInteger٪ [مزدوجة] 1000000000000000000000000000000
1.11111111111111E + 29
ويمكنك مشاهدة التشويه الذي يحدث نتيجة لتمثيل غير دقيق الداخلي للضعف الذي لا يمكن تمثيلها بدقة في ثنائي. كما يزيد من المقسوم دقة ما تبقى زيادة يحسن أيضا.