English 中文(简体)
确定沙捞越特定数量的精确度和规模
原标题:Determine precision and scale of particular number in Python

我在沙尔有一个变数,包含一个浮点号码(例如num = 24654.123),我愿意确定数字精确度和比额表值(从Oracle的意义上讲),因此123.45678应当给我(8,5),12.76应当给我(4,2)。

我首先想到的是使用扼杀性表述(通过<条码>>>/代码>或<代码>repr<>/code>),但这种表述在很多方面都失败(尽管现在我的理解是,这反映了在此问题上的浮动点代表的限制):

>>> num = 1234567890.0987654321
>>> str(num) = 1234567890.1
>>> repr(num) = 1234567890.0987654

Edit:

以下几点。 我应当澄清。 这一数字已经是浮动的,正在通过Cx_Oracle推向一个数据库。 我试图尽最大的努力,处理无法执行INSERT和处理Oracle错误的相应数据库类型太大的浮标(因为我当时想要处理一个领域而不是记录的数字)。 I guess map(len, repr(num).split( )?

最佳回答

把数位数调往小数点的左边很容易:

int(log10(x))+1

由于浮动点值的固有不准确,因此,对正确点权利的数字越发trick。 我需要几分钟的时间来说明这一点。

<><>Edit>: 根据这一原则,这里的法典完整。

import math

def precision_and_scale(x):
    max_digits = 14
    int_part = int(abs(x))
    magnitude = 1 if int_part == 0 else int(math.log10(int_part)) + 1
    if magnitude >= max_digits:
        return (magnitude, 0)
    frac_part = abs(x) - int_part
    multiplier = 10 ** (max_digits - magnitude)
    frac_digits = multiplier + int(multiplier * frac_part + 0.5)
    while frac_digits % 10 == 0:
        frac_digits /= 10
    scale = int(math.log10(frac_digits))
    return (magnitude + scale, scale)
问题回答

不可能有浮动点变量。 例如,打字

>>> 10.2345

说明:

10.234500000000001

因此,为了达到其中6.4条,你必须找到一种办法,对进入<代码>10.2345<<>>>的用户和<代码>10.23450000001<<<>的用户加以区分,因为无法使用浮标。 这与储存浮动点号码的方式有关。 使用<代码>decimal。

import decimal
a = decimal.Decimal( 10.234539048538495 )
>>> str(a)
 10.234539048538495 
>>>  (len(str(a))-1, len(str(a).split( . )[1]))
(17,15)

选择优于<条码>。 (Python 2):

>>> r=10.2345678
>>> r
10.234567800000001
>>> repr(r)
 10.234567800000001 
>>> str(r)
 10.2345678 

(0) 请确认或否认: 你们可以使用浮标,这是不可避免的,你可以拿到你的数据作为精子,Oracle数据型包括基于血清的类型,这一根本的不匹配是不可避免的。 请解释全部或部分否认。

(1) 你的“大量航程”是误导/无关紧要的。 一定代表浮标,从业余下可以看出。

(2) 也许,你可以使用新经验(Python 2.7和3.1),该新经验提供了仍然停留在float(repr(x))=x的最低限度可能的精度。

E.g. 旧经验(1.1)产生“1.100000000001”,新经验(1.1)产生“1.1”

大约“我猜测地图(透镜,再版)(南面)。 1. 离浮体的精确度和规模最接近的舱面?” 你们需要一项战略来处理(a) 消极数字和零号(b) 编号,如:<1.1e20。

如果你需要使用第2.6号或更早使用,那么 Objects/atoc的分解就应当改写浮动物体新pr的C代码。

(3) 也许如果你告诉我们有关甲骨质数据类型的光谱,我们可以帮助你设计检查,选择哪类能够包含一定浮动值。

def get_precision(f1):
    str1=str(f1)
    return len(str1.split(".")[1])

这一答复只反映了离奇后数位数。 由于浮动点数学可产生9999或00.1%,因此无法保证其准确无误。

我发现另一种解决办法似乎更为简单,但我不敢肯定,如果它能为所有案件工作。

   import math
   x = 1.2345678

   def flip(string):
       result = ""
       for ch in string:
           result = ch + result
      return result

   prec = int(math.log10(float(flip(str(x)))) + 1   # precision as int

如果需要核对相应的数字(a和b)

def prec_check(a, b):

  a = str(a)
  b = str(b)
  do = bool(True)
  n = 0

  while do == True:

    if a and b and a[n] == a[b]:
      n += 1

    else:
      do = false

    return n

请注意,这并不与“Decimal”模块合作。

如果你需要检查准确性,你可以尝试:

def prec_check(a,b)
  a = str(a)
  b = str(b)
  do = bool(True)
  n = 0
  while do == True:
    if a and b and a[n] == a[b]:
      n += 1
    else:
      do = false
  return n

com后的若干符号。 页: 1

def get_num_precision(num):
    count = 0
    while num * 10**count % 1 != 0:
        count += 1
    return count




相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签